Haskell 状态单子坐标
Haskell State Monad Coordinate
我想弄清楚状态 Monad 是如何工作的。我正在尝试实现一个函数,该函数获取两个坐标 (x, y)
和 returns 以及 x
或 y
坐标。这应该发生在 State 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))
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
我想弄清楚状态 Monad 是如何工作的。我正在尝试实现一个函数,该函数获取两个坐标 (x, y)
和 returns 以及 x
或 y
坐标。这应该发生在 State 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))
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