问题标签 [monads]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
4774 浏览

java - Java 中的 Null 安全解除引用,例如 ?。在 Groovy 中使用 Maybe monad

我正在研究从 Objective C 移植到 Java 的代码库。没有空检查的方法链接有几种用法

我正在寻找类似于安全取消引用运算符的东西?在 Groovy 中,而不是使用 nullchecks

这导致Maybe monad有了 Nothing 而不是 Null 的概念。但是当访问值时,我遇到的所有 Nothing 实现都抛出异常,这仍然不能解决链接问题。我让 Nothing 返回一个模拟,其行为类似于 NullObject 模式。但它解决了链接问题。

这个 Nothing 的实现有什么问题吗?

据我所知

  1. 在代码中使用模拟库感觉很奇怪
  2. 它不会在第一个 null 处停止。
  3. 由于空引用或名称实际上为空,我如何区分空结果?它在 Groovy 代码中是如何区分的?
0 投票
3 回答
424 浏览

haskell - 不寻常的类型签名

Monads for natural language semantics中,Chung-Chieh Shan 展示了如何使用 monad 对一些不同类型的自然语言现象(疑问句、焦点、内涵和量化)的标准描述进行很好的统一重述。他定义了两个可用于此目的的合成操作A_M和。A'_M

第一个很简单ap。在 powerset monadap中是非确定性函数应用程序,这对于处理疑问句的语义很有用;在 reader monad 中,它对应于通常的外延组合分析;等等

这是有道理的。然而,辅助组合操作的类型签名对我来说看起来很奇怪:

(Shan 称它为A'_M,但我会<?>在这里称它。)定义是您对类型的期望;它非常接近于ap

我想我可以理解这在论文的上下文中是如何做到的(处理疑问句的提问动词,用作内涵组合等)。它所做的并不是非常复杂,但是看到它在这里扮演如此重要的角色有点奇怪,因为它不是我以前在 Haskell 中看到的习语。

Hoogle 上没有任何有用的信息用于m (m a -> b) -> m a -> m bm (a -> b) -> a -> m b

其他情况下的任何人都觉得这很熟悉吗?你写过这个函数吗?

0 投票
4 回答
1154 浏览

c# - 对 IEnumerable 以外的类型(monad?)进行操作的 LINQ 查询表达式-- 可能的用途?

我正在阅读Tomas Petricek 和 Jon Skeet所著的Real-world functional programming一书,我很难消化关于计算表达式1)(又名 monads)的部分。

通过这本书,我了解到——与我以前的经验相反——LINQ 查询表达式不限于IEnumerable<T>,而是也可以在其他自定义类型上工作。这对我来说似乎很有趣,我想知道是否存在查询表达式语法 ( from x in ... select ...) 非常适合的场景。


一些背景资料:

显然,这种自定义类型被称为计算类型,它们被描述为与Haskell中的monad基本相同。我一直无法理解 monad 到底是什么,但根据书中的说法,它们是通过两个称为bindreturn的操作来定义的。

在函数式编程中,这两个操作的类型签名将是(我认为):

M一元类型的名称在哪里。

在 C# 中,这对应于:

事实证明,LINQ Enumerable.Select(投影运算符)与绑定操作具有完全相同的签名M := IEnumerable

我的自定义 LINQ 计算类型:

使用这些知识,我现在可以编写一个自定义计算类型,它不是 IEnumerable

现在我可以Wrapped<T>在 LINQ 查询表达式中使用,例如:

当然,这个例子不是很有用,但它演示了如何使查询表达式做一些除了使用集合之外的事情,例如用某种类型包装和展开值。


问题:

上面的计算类型似乎不是很有用。因此我想知道,使用 LINQ 查询表达式还有哪些其他合理的用途(除了处理集合)?


1)第 12.4 节:“介绍替代工作流程”,从第 334 页开始。

0 投票
3 回答
1465 浏览

haskell - Haskell 映射返回一个单子

Data.Map 和 Data.IntMap 中的查找函数当前返回带有类型签名的 Maybe 包装的值

它曾经有更一般的类型

我意识到前者可能会减少对额外类型规范的需求,但后者会使其更加通用并允许在列表推导中使用查找。有什么方法可以用新版本模仿这种行为,还是我必须使用旧版本的库?

0 投票
3 回答
1314 浏览

haskell - STM单子问题

这只是一个假设的场景来说明我的问题。假设它们之间共享两个线程和一个 TVar。在一个线程中有一个原子块读取 TVar 并需要 10 秒才能完成。在另一个线程中是一个原子块,它每秒修改一次 TVar。第一个原子块会完成吗?当然它会一直回到开头,因为日志永远处于不一致的状态?

0 投票
2 回答
1800 浏览

function - Haskell IO 传递给另一个函数

这里的这个问题与 Haskell Input Return Tuple有关

我想知道我们如何将输入从 monad IO 传递到另一个函数以进行一些计算。

其实我想要的是

在第二个示例中,从文件中读取 maxinvestinput 并将数据转换为期望的类型 maximuminvest。请帮忙。

谢谢。

0 投票
8 回答
61060 浏览

haskell - Haskell 中的大规模设计?

什么是设计/构造大型功能程序的好方法,尤其是在 Haskell 中?

我已经阅读了很多教程(Write Yourself a Scheme 是我最喜欢的,Real World Haskell 紧随其后)——但大多数程序都相对较小,而且用途单一。此外,我不认为其中一些特别优雅(例如,WYAS 中的大量查找表)。

我现在想编写更大的程序,有更多的移动部分——从各种不同的来源获取数据,清理它,以各种方式处理它,在用户界面中显示它,持久化它,通过网络通信等等。怎么可能一种最好的代码结构是清晰、可维护和适应不断变化的需求?

对于大型面向对象的命令式程序,有相当多的文献解决了这些问题。MVC、设计模式等想法是实现诸如关注点分离和面向对象风格中的可重用性等广泛目标的不错的处方。此外,较新的命令式语言适用于“随成长而设计”的重构风格,在我的新手看来,Haskell 似乎不太适合这种风格。

是否有与 Haskell 相当的文献?函数式编程(单子,箭头,应用程序等)中可用的奇异控制结构的动物园如何最好地用于此目的?您可以推荐哪些最佳实践?

谢谢!

编辑(这是唐斯图尔特回答的后续行动):

@dons 提到:“Monads 以类型捕获关键架构设计。”

我想我的问题是:一个人应该如何用一种纯函数式语言来思考关键的架构设计?

考虑几个数据流和几个处理步骤的例子。我可以将数据流的模块化解析器编写为一组数据结构,并且可以将每个处理步骤实现为纯函数。一条数据所需的处理步骤将取决于其价值和其他数据。某些步骤之后应该有一些副作用,例如 GUI 更新或数据库查询。

以一种很好的方式将数据和解析步骤联系起来的“正确”方法是什么?可以编写一个大函数来为各种数据类型做正确的事情。或者可以使用 monad 来跟踪到目前为止已处理的内容,并让每个处理步骤从 monad 状态中获取下一步需要的任何内容。或者可以编写大部分独立的程序并发送消息(我不太喜欢这个选项)。

他链接的幻灯片有一个“我们需要的东西”项目符号:“将设计映射到类型/函数/类/单子的惯用语”。有哪些成语?:)

0 投票
2 回答
767 浏览

monads - 将 Show 实例添加到 RWH 的 RandomState 示例

我刚刚从真实世界的 haskell 中输入了 RandomState 示例。它看起来像这样:

它可以工作,但不会显示结果。我收到错误消息:

我在为 Show RandomState 添加实例时遇到了一些问题。谁能告诉我这是怎么做到的?

谢谢。

0 投票
8 回答
5482 浏览

haskell - Haskell 真的是纯粹的吗(任何语言都可以处理系统外的输入和输出)?

在谈到函数式编程方面的 Monads 之后,该功能是否真的使一种语言变得纯粹,或者它只是黑板数学之外在现实世界中推理计算机系统的另一张“出狱卡”?

编辑:

这不是有人在这篇文章中所说的火焰诱饵,而是一个真正的问题,我希望有人能用它击倒我并说,证明,它是纯粹的。

此外,我正在研究关于其他不那么纯粹的函数式语言和一些使用良好设计并比较纯度的 OO 语言的问题。到目前为止,在我非常有限的 FP 世界中,我还没有理解 Monads 的纯度,你会很高兴知道,但是我确实喜欢不变性的想法,这在纯度赌注中更为重要。

0 投票
2 回答
11516 浏览

map - map 与 mapM 行为

我在 Real World Haskell 的 I/O 章节。书中还有 7 章没有讨论 Monad。也就是说,我对 I/O 的理解充其量是不完整的。

现在我正在尝试理解 mapM 函数。据我了解,该函数“执行”列表中必须是“动作”(IO monad)的每个元素。

没有意义的是这个例子。为什么 mapM 对于相同的参数返回与 map 不同的结果?