我正在关注PureScript一书中的exercises之一,我必须定义一个函数renderPath
,该函数采用Point
s(x和y)数组并且使用它们绘制路径(使用purescript-canvas
),其中Point
定义为
type Point = { x :: Number, y :: Number }
我决定将功能分为两个步骤。第一步是moveTo
数组中的第一个点,然后在其余点上使用lineTo
。
这是我到目前为止所写的功能,它只有第一步。但我得到了一个我无法弄清楚的错误。
这是功能
import Prelude
import Control.Monad.Eff (Eff)
import Data.Array.Partial (head, tail)
import Data.Maybe (Maybe(..))
import Graphics.Canvas (CANVAS, Context2D, arc, closePath, fillPath, getCanvasElementById, getContext2D, lineTo, moveTo, rect, setStrokeStyle, strokePath)
import Partial.Unsafe (unsafePartial)
renderPath :: forall eff
. Context2D
-> Array Point
-> Eff (canvas :: CANVAS | eff) Unit
renderPath ctx points = fillPath ctx $ do
p0 <- unsafePartial head points
moveTo ctx p0.x p0.y
我在函数的最后一行(p0
)moveTo ctx p0.x p0.y
得到了这一个错误
错误是:
Could not match type
{ x :: Number
| t0
}
with type
( x :: Number
, y :: Number
)
while checking that type ( x :: Number
, y :: Number
)
is at least as general as type { x :: Number
| t0
}
while checking that expression p0
has type { x :: Number
| t0
}
while checking type of property accessor p0.x
in value declaration renderPath
where t0 is an unknown type
我假设p0
的类型应为{ x :: Number, y :: Number }
此错误显示一个为{ x :: Number | t0 }
,另一个为( x :: Number, y :: Number)
。我根本不明白这一点。为什么一个人使用{}
而另一个()
。它们之间的区别是什么?我哪里错了?
我还要求解释以及任何更正,因为我是PureScript和整个函数式编程的新手,所以我在尝试理解很多概念时遇到了麻烦。
答案 0 :(得分:1)
我不完全确定您为何会收到该特定错误消息,但您的代码存在以下问题:
p0 <- unsafePartial head points
这应该是
let p0 = unsafePartial (head points)
<-
块中的 do
表示“从Eff
的上下文中获取值”。但由于unsafePartial (head points)
不是Eff
,因此类型不匹配,您会收到错误消息。
此代码编译:
http://try.purescript.org/?backend=flare&gist=6baa84215d33bf6f11c808e24b95c72f