Haskell 为什么是哈斯克尔';s列表未作为状态Monad的实例制作?
我阅读了一些Haskell的Stack和Queen示例代码(如下所示:)。他们将Stack和Queen作为State Monad的实例,使其易于使用 那么Haskell的列表可以作为状态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的实例,则很难使用(与直接
1:[2,3,4]
就像堆栈中的push 1。所以
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
在应用程序代码中可能比在库代码中更常见。