Functional programming Elm中的类型错误

Functional programming Elm中的类型错误,functional-programming,elm,Functional Programming,Elm,我是elm新手,但对函数式编程并不陌生,所以这个错误既令人沮丧又令人尴尬。我写了一个50行的elm程序,但我得到了这些难以捉摸的类型错误。简而言之,有人能在这段代码中找到类型错误吗 您可以将此代码直接粘贴到联机 导入鼠标 导入窗口 --模型 类型跟踪器={x:Int,y:Int,th:Float} 跟踪器:跟踪器 跟踪器={x=100,y=100,th=0.0} 信号跟踪器 trkS=常数跟踪器 dir:Tracker->(Int,Int)->(Int,Int)->Float 方向t(x',y'

我是elm新手,但对函数式编程并不陌生,所以这个错误既令人沮丧又令人尴尬。我写了一个50行的elm程序,但我得到了这些难以捉摸的类型错误。简而言之,有人能在这段代码中找到类型错误吗
您可以将此代码直接粘贴到联机

导入鼠标
导入窗口
--模型
类型跟踪器={x:Int,y:Int,th:Float}
跟踪器:跟踪器
跟踪器={x=100,y=100,th=0.0}
信号跟踪器
trkS=常数跟踪器
dir:Tracker->(Int,Int)->(Int,Int)->Float
方向t(x',y')(w',h')=
设(x,y)=toFloatT(x',y')
(w,h)=托夫洛特(w',h')
(dx,dy)=(x-w/2,h/2-y)
in(atan2(dy-(toFloat t.y))(dx-(toFloat t.x)))
信号浮动
dirS=lift3 dir trkS Mouse.position Window.dimensions
changeV:Float->Tracker->Tracker
变化vθt=
{t| th跟踪器->跟踪器
时间不早了=
let time=toFloat time'
x'=(toFloat t.x)+3*时间*(cos t.th)
y'=(toFloat t.y)+3*时间*(sin t.th)
在{t|x跟踪器->跟踪器中
步骤(dt,dir)=移动跟踪器dt.changeV dir
渲染(w',h')trk=
设(w,h)=(toFloat w',toFloat h')
在w'h'拼贴画中
[ngon 3 20 |>填充绿色
|>移动(trk.x,trk.y)
,asText(trk.th)|>toForm]
输入:信号(整数、浮点)
输入=
让增量=提升(圆形(\t->t/20))(每秒25帧)
在采样增量中(lift2(,)delta dirS)
主要=
lift2渲染窗口.尺寸(foldp步进跟踪器输入)
--辅助函数
托夫洛特(x,y)=(托夫洛特x,托夫洛特y)
roundF=toFloat.round
实际和预期的顺序 我将您的代码放在在线编辑器中,它给了我很多预期/实际的is Int/Float错误。我认为这是可以改进的,但这是邮件列表的问题。
您应该知道的是,编译器告诉您的预期/实际类型有时可以颠倒,至少在某些人的直觉看来是如此

调试问题 为了调试这个问题,我首先阅读并试图理解您的代码。代码足够简单,但我并不马上清楚程序的目标。无论如何,这样我没有发现任何异常。我特别关注了主代码行,其中编译器说类型错误,但这似乎不是错误的来源他解决了这个问题

添加类型注释 因此,我继续向尚未添加类型批注的函数添加了类型批注。通常,当您添加更多类型批注时,编译器可以为您提供更好的精确定位。
我补充说:

问题 然后,编译器告诉我错误在render函数中。我注意到您创建了窗口维度的浮点值,但没有使用它们,然后在
移动
的元组中使用了
跟踪器
的整数
x
y
>move
接受一个浮点元组

解决方案 因此,当您使用以下自适应渲染函数时,将编译:

render: (Int,Int) -> Tracker -> Element
render (w',h') trk =
  let trkPos = toFloatT (trk.x, trk.y)
  in collage w' h'
    [ngon 3 20 |> filled green
               |> move trkPos
    , asText (trk.th) |> toForm]
我希望通过向您展示我调试此类型错误的方法,您下次可以更轻松地找到解决方案

太长,读不下去了
问题是
render
函数:你给
move
函数一个
Int
s的元组,而不是它期望的
Float
s元组。可以找到固定的和编译的代码。

我不知道elm,但是你的类型有问题,例如:step期望的类型:Int实际类型:floatThank,th对你的调试的解释真的很有帮助!代码的目标是让三角形跟踪鼠标,很明显它还不在那里,但我会找到的!@ChrisU我很高兴我能帮上忙。如果你觉得我的答案足够,你能帮我吗?
render: (Int,Int) -> Tracker -> Element

main : Signal Element

toFloatT: (Int,Int) -> (Float,Float)

roundF: Float -> Float
render: (Int,Int) -> Tracker -> Element
render (w',h') trk =
  let trkPos = toFloatT (trk.x, trk.y)
  in collage w' h'
    [ngon 3 20 |> filled green
               |> move trkPos
    , asText (trk.th) |> toForm]