Monad"拆箱"

kab*_*oom 0 monads haskell functor

我的问题出现在教程Functors,Applicatives和Monads In Pictures及其JavaScript版本的教程中.

当文本说functor从上下文中展开值时,我理解Just 5- > 5转换正在发生.根据Haskell中"Just"语法的含义?,Just是Maybemonad的"范围定义" .

我的问题是整个展开的东西是如此神奇?我的意思是,有一些语言规则会自动解开"范围"变量的问题是什么?在我看来,这个动作只是在某种表中查找,其中符号Just 5对应于整数5.

我的问题是受JavaScript版本的启发,其中Just 5是原型数组实例.事实上,解缠是根本不是火箭科学.

这是"计算"类型的理由还是"程序员"理由?为什么我们区分Just 5来自5于编程语言水平?

jpa*_*ath 8

首先,我不认为你可以理解Monads之类的东西而不理解类似Haskell的类型系统(即没有学习像Haskell这样的语言).是的,有许多教程声称不然,但我在学习Haskell之前已经阅读了很多这些教程,但我没有得到它.所以我的建议是:如果你想了解Monads至少学习一些Haskell.

你的问题"为什么我们区分Just 5来自5于编程语言水平?".为了类型安全.在这种情况发生不被哈斯克尔大多数语言null,nil,whatever,常被用来表示没有价值的.然而,这经常导致类似的事情NullPointerExceptions,因为您没有预料到价值可能不存在.

在Haskell中没有null.因此,如果您有类型Int或其他任何值,则该值不可以null.你保证有价值.大!但有时你实际上想要/需要编码缺少值.在Haskell中,我们使用Maybe它.所以某种类型Maybe Int可能是Just 5或类似的东西Nothing.这种方式明确表示值可能不存在,并且您不会意外忘记它可能是Nothing因为您必须显式解包该值.

这与Monads没有任何关系,除了Maybe碰巧实现Monad类型类(如果你熟悉Java,类型类有点像Java接口).那也许主要不是Monad,但恰好也是Monad.


Car*_*arl 5

我想你是从错误的方向看这个. Monad显然不是关于展开. Monad是关于组成.

它允许您将类型的函数与类型a -> m b的值组合(不一定应用)m a以获取类型的值m b.我可以理解你可能认为明显的方法是将type m a的值展开为type 的值a.但很少有Monad实例以这种方式工作.实际上,唯一能够以这种方式工作的是与Identity类型相同的那些.对于几乎所有的实例Monad,只能打开一个值.

考虑Maybe.当起始值为时,将类型值展开为类型Maybe aa是不可能的Nothing.Monadic作品必须做一些比打包更有趣的事情.

考虑[].除非输入恰好是长度为1的列表,否则将[a]类型值展开为类型值a是不可能的.在所有其他情况下,monadic组合正在做一些比展开更有趣的事情.

考虑IO.像getLine :: IO String这样的String值不包含值.打开它几乎是不可能的,因为它没有包装东西.Monadic IO值的组合不会解开任何东西.它将IO值组合成更复杂的IO值.

我认为值得调整你的观点是什么Monad意思.如果它只是一个展开的界面,那将毫无用处.但它更加微妙.这是一个合成界面.