I'm following one of the exercises in the PureScript book where I have to define a function renderPath
that takes an array of Point
s (x and y) and draws a path using them (using purescript-canvas
), where a Point
is defined as
type Point = { x :: Number, y :: Number }
I've decided to split the function into two steps. The first step is to moveTo
the first point in the array and then use lineTo
over the remaining points.
Here is the function I've written so far which only has the first step. But I get this one error that I just can't figure out.
Here's the function
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
And I get this one error at p0
in the last line of the function (moveTo ctx p0.x p0.y
)
The error is:
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
I'm assuming that p0
should be of the type { x :: Number, y :: Number }
This error shows one as { x :: Number | t0 }
and the other as ( x :: Number, y :: Number)
. I don't understand this at all. Why is one using {}
and the other ()
. What's the difference between them? Where am I going wrong?
I'd also request an explanation along with any correction as I'm new to PureScript and functional programming as a whole so I'm having trouble trying to understand a lot of concepts.