我正在Haskell学习monads,我理解它们为什么有用,我总体上理解了如何绑定、加入、返回做什么。
我还查看了基本读取器/作者/状态/列表/可能是monad的基本用法示例。
尽管如此,作为一个初学者,我仍然觉得我不掌握什么是“运行”函数(例如runState,runReader,runWriter)的一般含义。它似乎没有像上面的函数那样的通用签名,如果它是可定义的/对所有的monads都有意义的话,我就不会理解它。
发布于 2019-02-05 15:44:37
大多数monad的run函数实际上只是内部表示monad的一个工件;例如,理论上可以将Reader monad表示为
type Reader r a = r -> aState as
type State s a = s -> (s, a)诸若此类。但是,如果我们这样做,那么我们就不能为Reader和State提供不同的类型实现(包括State),因为它们都将由(->)来表示。
-也就是说,如果我们写
instance Functor (Reader r)
-- ....和
instance Functor (State s)
-- ...我们的编译器会抱怨我们试图为(->) a提供两个不同的(->) a实现。
因此,与type不同,我们只是或多或少地用newtype编写了相同的东西。
newtype Reader r a = Reader { runReader :: r -> a }或
newtype State s a = State { runState :: s -> (s, a)}正如您所看到的,run函数实际上在这里什么都不做,它们只是“解包装”newtype,这样我们就可以得到底层的值。
(实际的实现可能涉及单台转换器,因此看起来要复杂一些,但实际上它们仍然在做同样的事情)。
https://stackoverflow.com/questions/54535513
复制相似问题