gpt4 book ai didi

haskell - 是否/应该将函数包装到 monad 转换器中被视为不好的做法?

转载 作者:行者123 更新时间:2023-12-04 10:12:07 28 4
gpt4 key购买 nike

假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。

现在,一个简单且不常见的方法是:

第一种可能性

find a = ReaderT (lookup a)

但是,这似乎确实断言了有关 ReaderT 转换器如何工作的一些不平凡的事情。查看 Control.Monad.Reader 的源代码,很明显这很好用。但我还没有阅读任何支持这一点的文档。但是我们也可以这样写 find:

第二种可能
find a = do  y <- ask 
lift (lookup a y)

类似的想法也适用于包装 MaybeT , StateT , StateReader .通常我会写类似于第一个示例的内容,但大多数情况下,如何编写类似于第二个示例真的很明显,您甚至可能会说它更具可读性。所以我的问题是:像第一个例子这样的代码应该被认为是坏的吗?

最佳答案

我认为第一种方式最大的问题是:

If the mtl authors (or whatever transformer library you use), decide to stop exporting the data constructor for ReaderT then it will stop working. This happened with the State monad in the version bump from mtl 1 to mtl 2 and it's quite annoying. Whereas, ask is part of the official api of Reader and you should plan on it sticking around.



另一方面,我不会认为第一种方式是错误的。

关于haskell - 是否/应该将函数包装到 monad 转换器中被视为不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4317101/

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