我想弄清楚Monad的状态如何运作。我正在尝试实现一个获取两个坐标(x, y)
并返回x
或y
坐标的函数。这应该发生在Monad州内。
data Coordin = Coordin {x,y :: Float}
应该实现的功能看起来像这样:
getX :: State Coordin Float
getY :: State Coordin Float
这怎么可以解决?
我试过这个:
newtype State s a = State { runState :: s -> (a,s) }
getX:: State Coordin Float
getX = State $ \(x, y) -> (x, (x, y))
但收到此错误消息:
Couldn't match type ‘(Float, t0)’ with ‘Coordin’
Expected type: State Coordin Float
Actual type: State (Float, t0) Float
In the expression: State $ \ (x, y) -> (x, (x, y))
In an equation for ‘getX’: getX = State $ \ (x, y) -> (x, (x, y))
答案 0 :(得分:3)
State $ \(x, y) -> (x, (x, y))
的类型为State (Float,Float) Float
,它与State Coordin Float
确实相同(同构),但它并不是字面上相同的类型。必须使用Coordin
构造函数解包Coordin
类型,而不是使用元组构造函数!
getX :: State Coordin Float
getX = State $ \(Coordin x y) -> (x, Coordin x y)
或者,您最好使用记录字段访问者:
getX = x <$> get