我的问题是在遵循图片中的函数、应用程序和单子教程及其JavaScript版本时提出的。
当文本说functor从上下文中展开值时,我理解a只有5个
-
我的问题是,整件拆开包装的事情有什么神奇之处?我的意思是,有一些自动打开“范围”变量的语言规则有什么问题?在我看来,这个操作只是某种表中的一个查找,其中符号Just 5
对应于整数5
。
我的问题受到JavaScript版本的启发,其中Just 5
是原型数组实例。所以展开确实不是火箭科学。
这是“为了计算”的原因还是“为了程序员”的原因?为什么我们要在编程语言级别上区分5
和5
?
匿名用户
一个可能的例子是:考虑Haskell类型也许(也许是Int)
。它的值可以是以下形式
什么都没有
什么都没有
Just(Just n)
对于某个整数n
如果没有包装,我们就无法区分前两个。
实际上,可选类型可能是a
的全部要点是向现有类型a
添加一个新值(Nothing
)。为了确保这样的Nothing
确实是一个新值,我们将其他值包装在Just
中。
它也有助于类型推断。当我们看到函数调用f'a'
时,我们可以看到f
是在类型Char
处调用的,而不是在类型Maybe Char
或Maybe(Maybe Char)
处调用的。typeclass系统允许f
在每种情况下都有不同的实现(这类似于某些OOP语言中的“重载”)。
我认为你从错误的方向看这个。Monad
明确地不是关于展开。Monad
是关于组合的。
它允许您组合(不一定应用)a类型的函数-
考虑一下
可能
。当起始值为Nothing
时,不可能将类型的值a
展开为a
类型的值。一元构图必须做一些比拆开包装更有趣的事情。
考虑一下
[]
。除非输入恰好是长度为1的列表,否则不可能将[a]
类型的值展开为a
类型的值。在其他任何情况下,一元构图都比拆开包装更有趣。
考虑一下
IO
。像getLine::IO String
这样的值不包含String
值。这显然是不可能打开的,因为它没有包装什么东西。IO
值的一元组合不会打开任何东西。它将IO
值组合成更复杂的IO
值。
我认为值得调整您对
Monad
含义的看法。如果它只是一个展开界面,它将非常无用。不过,它更微妙。这是一个组合界面。
首先,我认为如果不了解像Haskell这样的类型系统(即不学习像Haskell这样的语言),你就无法理解Monads之类的东西。是的,有很多教程声称并非如此,但我在学习Haskell之前已经阅读了很多,但我没有得到它。所以我的建议:如果你想了解Monads,至少学习一些Haskell。
对于您的问题“为什么我们要在编程语言级别上区分5
和5
?”。为了类型安全。在大多数碰巧不是Haskell的语言中,null
,nil
,无论什么,都经常用来表示没有值。然而,这通常会导致出现
NullPointerExceptions
,因为您没有预料到值可能不存在。
在Haskell中没有
null
。因此,如果您有一个类型为Int
的值,或者其他任何值,那么该值不能是null
。你被保证有价值。太棒了但有时你真的想要/需要对缺少值的情况进行编码。在Haskell中,我们使用也许
。所以类型的东西可能是Int
或者是只有5个
或者什么都没有
。通过这种方式,可以明确表示该值可能不存在,并且您不能意外地忘记它可能是Nothing
,因为您必须明确地展开该值。
这实际上与Monad无关,除了
也许
碰巧实现了Monad类型类(如果您熟悉Java,类型类有点像Java接口)。那就是也许主要不是Monad,但恰好也是Monad。
pointed functor 在继续后面的内容之前,我得向你坦白一件事:关于我们先前创建的容器类型上的 of 方法,我并没有说出它的全部实情。真实情况是,of 方法不是用来避免使用 new 关键字的,而是用来把值放到默认最小化上下文(default minimal context)中的。是的,of 没有真正地取代构造器——它是一个我们称之为 pointed 的重要接口的一部分。 pointed
问题内容: 现在,node.js支持ECMAScript Harmony生成器, 我们可以在Haskell中简洁地编写ala代码单子代码了: 在上面的代码中,有一个函数可用于创建 确定性 单子,例如: 您现在可以按以下方式使用: 上面的函数接受两个字符串,将它们转换为列表,然后压缩它们。如果有错误,则立即返回。它取决于以下功能: 我们对其进行测试,以检查其是否可以正常工作: 同样,我们可以创建任何
当我们第一次谈到 Functor 的时候,我们了解到他是一个抽象概念,代表是一种可以被 map over 的值。然后我们再将其概念提升到 Applicative Functor,他代表一种带有 context 的型态,我们可以用函数操作他而且同时还保有他的 context。 在这一章,我们会学到 Monad,基本上他是一种加强版的 Applicative Functor,正如 Applicativ
动机: 避免样板代码 Monad提供了一种强大途径以构建带效果的计算。虽然各个标准monad皆专一于其特定的任务,但在实际代码中,我们常常想同时使用多种效果。 比如,回忆在第十章中开发的 Parse 类型。在介绍monad之时,我们提到这个类型其实是乔装过的 State monad。事实上我们的monad比标准的 State monad 更加复杂:它同时也使用了 Either 类型来表达解析过程中
monad是否有处理异常处理的内置支持?类似于Scala的try。我问是因为我不喜欢未经检查的例外。
这是我的解析器代码。显然,我已经用“旧的方式”做了,不能真正让它以新的方式工作。你能告诉我为了让它工作我需要修理哪些东西吗?我读了这篇文章(https://wiki.haskell.org/Functor-Applicative-Monad_Proposal)试图更改我的代码,但我觉得我做错了什么。 我得到的编译错误是: 编辑// 现在的代码是: 错误: