问题标签 [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 投票
1 回答
993 浏览

state - MonadState get 和 put 的原因?

我正在阅读 Real World Haskell 中的 Monads 章节(第 14 章)。一个函数定义如下:

我不太了解这里的 get 和 put 函数的目的。我重写了以下函数,它似乎做同样的事情并且更简洁:

所以我的问题是:get 和 put 一般的目的是什么?

0 投票
3 回答
1548 浏览

scala - scala中高阶多态性的常见做法

我试图通过实现一个描述 monad 的非常基本的接口来掌握 scala 中的高阶多态性,但我遇到了一个我不太了解的问题。

我用 C++ 实现了相同的代码,代码如下所示:

当尝试对 scala 做同样的事情时,我失败了:

编译器抱怨:

我在这里做错了什么?似乎有一个关于 scala 类型构造函数的基本概念我似乎不了解。

问候, raichoo

0 投票
2 回答
890 浏览

haskell - 为什么这个 Either-monad 代码不进行类型检查?

'baby.hs' 中的这段代码片段导致了可怕的编译错误:


为什么会这样?我怎样才能使这段代码编译?感谢您的帮助~

我知道了。我调整了代码以查看它的编译:

它编译成功!但是......还有一个问题:

使'Either a'成为一个单子,我得到'return = Right'......我怎么能得到'return = Left'?我试过这个但失败了:

或:实例 Monad (\x -> 任一个 xa)

根本不编译!

0 投票
3 回答
2507 浏览

.net - 状态单子,为什么不是一个元组?

我刚刚把我的头绕在单子上(至少我想我想我有),更具体地说是状态单子,有些人比我聪明得多,所以我可能对这个问题有所了解.

无论如何,状态单子通常用 M<'a> 来实现,如下所示(F#):

现在我的问题是:你有什么理由不能在这里使用元组吗?MonadA<'a, 'b>除此之外,和之间可能存在的歧义MonadB<'a, 'b>都将成为等价的('a * 'b)元组。

编辑:为清楚起见添加了示例

0 投票
1 回答
688 浏览

haskell - 延续单子“接口”

状态单子“接口”

(+ return and bind) 允许在不使用State构造函数的情况下使用 State monad 构造任何可能的计算。例如,State $ \s -> (s+1, s-1)可以写成

同样,我永远不必使用Reader构造函数,因为我可以使用ask,return(>>=). 准确地说:Reader f == ask >>= return . f

延续是否也一样——是否可以编写所有Cont r a使用实例callCC(中唯一的函数MonadCont)、返回和绑定,并且从不输入类似的东西Cont (\c -> ...)

0 投票
2 回答
301 浏览

haskell - 尝试实现 (>>=) 函数以创建自定义 monad 转换器时键入错误

我正在尝试为未来的项目创建一个 monad 转换器,但不幸的是,我对 Monad 类型类 (>>=) 函数的实现不起作用。

首先,这是底层 monad 的实现:

在这里,Monad 类型类的实现由 GHC 自动完成(使用GeneralizedNewtypeDeriving语言 pragma)。monad 转换器定义如下:

问题来自我实例化 Monad typeclasse 的 (>>=) 函数的方式:

在我看来,第一个>>=在底层m单子中运行。因此,runRuntimeT x >>=返回一个类型的值Runtime a(对吗?)。然后,下面的代码 ,id >>=应该返回一个 type 的值a。该值被传递给类型为 f 的函数f :: (Monad m) => a -> RuntimeT m b

这里出现了类型问题:f函数的类型与 (>>=) 函数所需的类型不匹配。我能让这个连贯吗?我明白为什么这不起作用,但我无法将它变成功能性的东西。

编辑:错误信息:

感谢您的帮助,并毫不犹豫地纠正我信息中的任何缺陷,
查理 P。

0 投票
3 回答
681 浏览

haskell - monads Writer m 和 Either e 是绝对对偶的吗?

Writer m我注意到和Either e单子之间存在双重关系。如果 m 是一个幺半群,那么

可用于形成一个单子:

() 的对偶是 Void(空类型),积的对偶是联积。每个类型 e 都可以被赋予“comonoid”结构:

以明显的方式。现在,

这就是Either e单子。箭头遵循完全相同的模式。

问题:是否可以编写一个通用代码来执行 asEither e和 asWriter m取决于给定的幺半群?

0 投票
2 回答
1620 浏览

c# - Func + 扩展方法 + lambdas 中的 C# 歧义

我一直在努力完成这篇文章:

http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

...第 1 页上的某些内容让我感到不舒服。特别是,我试图围绕 Compose<>() 函数进行思考,并为自己编写了一个示例。考虑以下两个 Func:

没问题!很容易理解这两个做什么。

现在,按照文章中的示例,您可以编写一个通用扩展方法来组合这些函数,如下所示:

美好的。所以现在你可以说:

你得到字符串“50%”

到目前为止,一切都很好。

但这里有些模棱两可。假设您编写了另一个扩展方法,那么现在您有两个函数:

这里是歧义。这两个函数没有重叠签名吗?是的。这甚至可以编译吗?是的。哪一个被调用?第二个(显然给你“错误”的结果)被调用。如果您注释掉任何一个函数,它仍然可以编译,但您会得到不同的结果。

这似乎是在吹毛求疵,但这里有一些东西深深地冒犯了我的感情,我不能指望它。它与扩展方法有关吗?它与lambda有关吗?或者它是否与 Func<> 允许您参数化返回类型有关?我不确定。

我猜这一切都在规范中的某个地方得到解决,但我什至不知道谷歌要找到什么。

帮助!

0 投票
20 回答
158261 浏览

oop - 简单的英语单子?(面向没有FP背景的OOP程序员)

就 OOP 程序员可以理解的(没有任何函数式编程背景)而言,什么是 monad?

它解决了什么问题,最常见的地方是什么?

更新

为了澄清我正在寻找的那种理解,假设您正在将具有 monad 的 FP 应用程序转换为 OOP 应用程序。您将如何将 monad 的职责移植到 OOP 应用程序?

0 投票
2 回答
631 浏览

scala - 我可以将这个异步 Java 网络 API 转换为一元表示(或其他惯用的表示)吗?

我已经获得了一个 java api,用于使用基于回调的样式连接到专有总线并通过专有总线进行通信。我目前正在 scala 中实现一个概念验证应用程序,并且我正在尝试弄清楚如何生成一个稍微更惯用的 scala 界面。

一个典型的(简化的)应用程序在 Java 中可能看起来像这样:

在 scala 中,我显然可以定义从 (T => Unit) 到 IListener 的隐式转换,这无疑使事情更易于阅读:

看到这个让我想起了 scalaz promises 和 f# async 工作流。

我的问题是这样的:

我可以将其转换为理解或类似的惯用语吗(我觉得这也应该很好地映射到演员)

理想情况下,我希望看到类似的内容: