首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >monads“运行”功能的直觉

monads“运行”功能的直觉
EN

Stack Overflow用户
提问于 2019-02-05 13:27:05
回答 1查看 345关注 0票数 8

我正在Haskell学习monads,我理解它们为什么有用,我总体上理解了如何绑定、加入、返回做什么。

我还查看了基本读取器/作者/状态/列表/可能是monad的基本用法示例。

尽管如此,作为一个初学者,我仍然觉得我不掌握什么是“运行”函数(例如runState,runReader,runWriter)的一般含义。它似乎没有像上面的函数那样的通用签名,如果它是可定义的/对所有的monads都有意义的话,我就不会理解它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 15:44:37

大多数monad的run函数实际上只是内部表示monad的一个工件;例如,理论上可以将Reader monad表示为

代码语言:javascript
复制
type Reader r a = r -> a

State as

代码语言:javascript
复制
type State s a = s -> (s, a)

诸若此类。但是,如果我们这样做,那么我们就不能为ReaderState提供不同的类型实现(包括State),因为它们都将由(->)来表示。

-也就是说,如果我们写

代码语言:javascript
复制
instance Functor (Reader r)
  -- ....

代码语言:javascript
复制
instance Functor (State s)
  -- ...

我们的编译器会抱怨我们试图为(->) a提供两个不同的(->) a实现。

因此,与type不同,我们只是或多或少地用newtype编写了相同的东西。

代码语言:javascript
复制
newtype Reader r a = Reader { runReader :: r -> a }

代码语言:javascript
复制
newtype State s a = State { runState :: s -> (s, a)}

正如您所看到的,run函数实际上在这里什么都不做,它们只是“解包装”newtype,这样我们就可以得到底层的值。

(实际的实现可能涉及单台转换器,因此看起来要复杂一些,但实际上它们仍然在做同样的事情)。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54535513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档