当前位置: 首页 > 知识库问答 >
问题:

Monad"拆箱"

左丘积厚
2023-03-14

我的问题是在遵循图片中的函数、应用程序和单子教程及其JavaScript版本时提出的。

当文本说functor从上下文中展开值时,我理解a只有5个-

我的问题是,整件拆开包装的事情有什么神奇之处?我的意思是,有一些自动打开“范围”变量的语言规则有什么问题?在我看来,这个操作只是某种表中的一个查找,其中符号Just 5对应于整数5

我的问题受到JavaScript版本的启发,其中Just 5是原型数组实例。所以展开确实不是火箭科学。

这是“为了计算”的原因还是“为了程序员”的原因?为什么我们要在编程语言级别上区分55

共有3个答案

袁晋鹏
2023-03-14
匿名用户

一个可能的例子是:考虑Haskell类型也许(也许是Int)。它的值可以是以下形式

  • 什么都没有
  • 什么都没有
  • Just(Just n)对于某个整数n

如果没有包装,我们就无法区分前两个。

实际上,可选类型可能是a的全部要点是向现有类型a添加一个新值(Nothing)。为了确保这样的Nothing确实是一个新值,我们将其他值包装在Just中。

它也有助于类型推断。当我们看到函数调用f'a'时,我们可以看到f是在类型Char处调用的,而不是在类型Maybe CharMaybe(Maybe Char)处调用的。typeclass系统允许f在每种情况下都有不同的实现(这类似于某些OOP语言中的“重载”)。

姬雪松
2023-03-14

我认为你从错误的方向看这个。Monad明确地不是关于展开。Monad是关于组合的。

它允许您组合(不一定应用)a类型的函数-

考虑一下可能。当起始值为Nothing时,不可能将类型的值a展开为a类型的值。一元构图必须做一些比拆开包装更有趣的事情。

考虑一下[]。除非输入恰好是长度为1的列表,否则不可能将[a]类型的值展开为a类型的值。在其他任何情况下,一元构图都比拆开包装更有趣。

考虑一下IO。像getLine::IO String这样的值不包含String值。这显然是不可能打开的,因为它没有包装什么东西。IO值的一元组合不会打开任何东西。它将IO值组合成更复杂的IO值。

我认为值得调整您对Monad含义的看法。如果它只是一个展开界面,它将非常无用。不过,它更微妙。这是一个组合界面。

裴永年
2023-03-14

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

对于您的问题“为什么我们要在编程语言级别上区分55?”。为了类型安全。在大多数碰巧不是Haskell的语言中,nullnil无论什么,都经常用来表示没有值。然而,这通常会导致出现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)试图更改我的代码,但我觉得我做错了什么。 我得到的编译错误是: 编辑// 现在的代码是: 错误: