首页 文章

哈斯克尔州Monad协调员

提问于
浏览
-2

我想弄清楚Monad的状态如何 . 我正在尝试实现一个获取两个坐标 (x, y) 并返回 xy 坐标的函数 . 这应该发生在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))

1 回答

  • 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
    

相关问题