gpt4 book ai didi

Haskell——理解编写器类型声明

转载 作者:行者123 更新时间:2023-12-04 18:11:05 26 4
gpt4 key购买 nike

我在《Learn You a Haskell for Great Good!》一书中学习了 monads。米兰利波卡。我正在阅读 Control.Monad.Writer 模块如何导出 Writer w a type连同它的 Monad 实例和一些有用的函数来处理这种类型的值。
它给出了 Writer type声明示例。
对于以下代码:

-- Writer w a corresponding to (a, w)  <--- the order is reversed
newtype Writer w a = Writer { runWriter :: (a, w) } -- <--- (a, w)
在这里,为什么pair类型的顺序是相反的?
我可以声明 Writer type吗像这样?
-- Writer w a corresponding to (w, a) <--- same order with Writer w a
newtype Writer w a = Writer { runWriter :: (w, a) } -- <--- (w, a)
如果我选择 Writer type 的第二个选择声明,写Haskell有什么不好的影响吗?
为了找出 Writer Monad , 我试过阅读 Haskell Writer Monad Source Code(来自 https://hackage.haskell.org/package/transformers-0.6.0.4/docs/src/Control.Monad.Trans.Writer.Strict.html#WriterT)
newtype WriterT w m a = WriterT { runWriterT :: m (a, w) }
对类型的顺序也颠倒了。为什么不能这样定义?
newtype WriterT w m a = WriterT { runWriterT :: m (w, a) }
这有什么原因吗?
谢谢你的帮助。

最佳答案

swap 证明了这一点函数,元组 (a, b)(b, a) 同构,所以是的,您可以简单地更改元组元素的顺序。能力上没有区别。
某些 API 看起来像它们的样子通常是有历史原因的。我不知道 Writer monad 背后的确切历史,但总的来说,如果您想象自己来自命令式/过程式/面向对象的背景,那么与基于 Writer 的东西等效的 API 将是一个过程返回一个值,但也会更改一些可变状态(全局变量或可变输入参数)。
例如,在 C# 中,它可能如下所示:

public int Foo(ICollection<string> log)
其中返回值为 int , 而可写资源是字符串的集合。
一旦你决定摆脱突变,你必须改为返回 log 的新版本。 , 但由于该方法已经返回 int ,你必须返回一个元组。您应该将“原始”返回类型作为元组中的第一个元素还是第二个元素?
将“原始”返回类型作为第一个元素似乎很直观。因此,在上面的示例中,您可能会使用这样的 API(现在采用 Haskell 语法):
foo :: [String] -> (Int, [String])
或者,更一般地说,
(a, w)
对于具有 Functor 的类型和 Monad然而,在实例中,Haskell 要求 fmap 中“参与”的类型变量, >>= , 等等是最右边的类型变量。
这就是 WriterT w m a 的原因。用 a 定义最右边,而不是,比如说, WriterT w a mWriterT a w m .
鉴于 a必须在最右边,后续问题可能是:为什么是 WriterT w m a而不是 WriterT m w a ?
那是因为通过放置 'monad' 类型变量 m Writer 类型变量的右侧 w ,您可以部分应用 Identity单子(monad)到 WriterT定义 Writer :
type Writer w = WriterT w Identity
看看你是否可以交换 (a, w) 可能是一个很好的练习与 (w, a)看看你是否仍然可以实现所有实例。

关于Haskell——理解编写器类型声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71448795/

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