gpt4 book ai didi

haskell - 理解一个 monad 实例

转载 作者:行者123 更新时间:2023-12-04 23:06:34 27 4
gpt4 key购买 nike

我有这个 Haskell 代码部分:

newtype State st a = State (st -> (st, a))

instance Monad (State state) where
return x = let f t = (t,x) in State f

State f >>= g = State (\oldstate ->
let {(newstate, val) = f oldstate;
State f'= g val}
in f' newstate)

我是 monad 的新手,但我想我知道了 returnbind在一般情况下工作。

但在上面的例子中我有很多问题:
  • Monad (State state) State 是 Monad 的名字吗?如何
    newtype State ... 相关?
  • return x = let f t = (t,x) in State f t 在哪里?来自?
  • 最佳答案

    所以到目前为止,你肯定听说过柯里化(Currying)或部分应用:如果你有 f :: a -> b -> cx :: a ,然后 f x :: b -> c .即,如果 f是一个有两个参数的函数和 x类型为 f的第一个参数,然后是 f x是一个接受第二个参数并“完成”应用程序的函数。

    好吧,在 Haskell 中,同样的事情也适用于类型构造函数,如 State。 .类型和类型构造函数有一种类型,类似于值如何具有类型。像 Integer 这样的非参数类型有样* ;单参数类型,如 Maybe有样* -> * ; State有样* -> * -> * .

    然后,State stateState 的部分应用类型构造函数,并且有种类 * -> * . Monad是适用于 * -> * 的类.因此,应用于我们的示例:

  • instance Monad (Integer) where ...被禁止,因为 Integer有样* .
  • instance Monad (Maybe) where ...被允许,因为 Maybe有样* -> * .
  • instance Monad (State) where ...被禁止,因为 State有样* -> * -> * .
  • instance Monad (State st) where ...被允许,因为 State st有样* -> * .

  • 我们怎么知道 Monad适用于种类 * -> * ?我们可以从类声明中推断出来:
    class Monad m where
    return :: a -> m a
    (>>=) :: m a -> (a -> m b) -> m b
    -- ...

    看看如何 m在此类声明中使用:作为 m a 的一部分和 m b ,即作为一个论点。因此,Haskell 推断 m是一种类型变量 * -> * .

    与此相比:
    class Num a where
    (+) :: a -> a -> a
    (-) :: a -> a -> a
    -- ...

    这里的类型变量 a不适用于其他类型变量——因此它必须是种类 * .

    所以严格来说, State不是单子(monad);它是一个两位类型的构造函数,当部分应用于仅一种类型时,它会为您提供一个 monad。所以 State state是一个单子(monad), State Integer 也是, State [a]等等。人们确实经常说话松散地谈论 State。和 monad 类似的东西,但是你应该理解它是一个参数化的 monad——它是一个具有内部类型参数的 monad,因此许多变体在该参数的类型上有所不同。

    关于haskell - 理解一个 monad 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903038/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com