Haskell 为什么是哈斯克尔';s列表未作为状态Monad的实例制作?

Haskell 为什么是哈斯克尔';s列表未作为状态Monad的实例制作?,haskell,Haskell,我阅读了一些Haskell的Stack和Queen示例代码(如下所示:)。他们将Stack和Queen作为State Monad的实例,使其易于使用 那么Haskell的列表可以作为状态Monad的实例吗 但若否,原因为何?它似乎插入了一个列表 1:[2,3,4] 就像堆栈中的push 1。所以 列表可以作为状态Monad的实例吗 如果可以,为什么Haskell不把它作为状态Monad的实例呢?我认为,因为它是最常用的数据结构,所以如果将其作为State Monad的实例,则很难使用(与直接

我阅读了一些Haskell的Stack和Queen示例代码(如下所示:)。他们将Stack和Queen作为State Monad的实例,使其易于使用

那么Haskell的列表可以作为状态Monad的实例吗

但若否,原因为何?它似乎插入了一个列表

1:[2,3,4]
就像堆栈中的push 1。所以

  • 列表可以作为状态Monad的实例吗

  • 如果可以,为什么Haskell不把它作为状态Monad的实例呢?我认为,因为它是最常用的数据结构,所以如果将其作为State Monad的实例,则很难使用(与直接使用相比)


  • State
    单子族可以使用任何大小的数据结构作为其状态,包括列表——每个结构族中都有一个单子。

    正如Daniel Wagner指出的,任何数据结构都可以用作State单子族中的状态,包括列表

    列表可以作为状态Monad的实例吗

    使用Word实例意味着可能考虑状态单元格类型类。不是(但请继续阅读)。State是

    Monad
    的一个特定实例,就像
    []
    (list)是一样,并且就像
    Maybe
    或者l
    都是
    Monad
    的实例一样

    尽管如此,我承认事情有些混乱,因为。但是,如果您查看这些实例,就会发现它们中的大多数都是自引用的。只定义了两个“叶”实例,
    StateT
    (从中定义了
    State
    )和外来的
    RWST

    如果您考虑<代码>状态>代码>,您将看到它始终是<代码> Monad < /代码>。对于

    StateT

    Monad m => Monad (StateT s m)
    
    由于
    状态
    定义为:

    type State s = StateT s Identity
    
    Identity
    无条件地是一个
    Monad
    实例,您可以得到
    状态s
    始终是一个
    Monad
    ,而不管
    s
    是什么


    这就是丹尼尔·瓦格纳指出的。具体来说,
    State[Int]
    State[Char]
    State[Bool]
    等都是
    Monad
    实例。这是一个Monad家族。

    您可以链接您所指的示例代码吗?@oisdk我想这是关于第04节的:“添加State Monad/我们最终可以将队列包装到State Monad中,以便更轻松地链接操作。”-我猜OP读到,当把队列作为一个说monadI的实例时,你会觉得状态monad中的队列比队列更容易使用-我认为这是错误的-这个monad不会神奇地把Haskell变成命令式语言-你必须把你想做的任何事情都推到状态monad中上下文以这种方式工作-这可能更容易,也可能只是更多的样板文件,取决于您的情况FTR,
    RWST
    ,并没有什么特别之处,它只是一个预先制作好的相当于一堆
    读取器的东西,
    Writer
    State
    transformers.@leftaroundabout我的意思是异国情调,因为它很少见到,但我可能弄错了。虽然我从未在其他地方见过它,但我只是其中的一个样本。您是否看到它在
    Control.Monad.State
    模块(和子模块)之外使用?“State是
    Monad
    的一个特定实例”——您可能会觉得有趣(我看到了)。我认为
    RWST
    在应用程序代码中可能比在库代码中更常见。