PureScript"无法匹配类型"记录错误

时间:2017-06-06 18:47:49

标签: html5-canvas purescript

我正在关注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

我在函数的最后一行(p0moveTo 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和整个函数式编程的新手,所以我在尝试理解很多概念时遇到了麻烦。

1 个答案:

答案 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