问题标签 [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.
state - MonadState get 和 put 的原因?
我正在阅读 Real World Haskell 中的 Monads 章节(第 14 章)。一个函数定义如下:
我不太了解这里的 get 和 put 函数的目的。我重写了以下函数,它似乎做同样的事情并且更简洁:
所以我的问题是:get 和 put 一般的目的是什么?
scala - scala中高阶多态性的常见做法
我试图通过实现一个描述 monad 的非常基本的接口来掌握 scala 中的高阶多态性,但我遇到了一个我不太了解的问题。
我用 C++ 实现了相同的代码,代码如下所示:
当尝试对 scala 做同样的事情时,我失败了:
编译器抱怨:
我在这里做错了什么?似乎有一个关于 scala 类型构造函数的基本概念我似乎不了解。
问候, raichoo
haskell - 为什么这个 Either-monad 代码不进行类型检查?
'baby.hs' 中的这段代码片段导致了可怕的编译错误:
为什么会这样?我怎样才能使这段代码编译?感谢您的帮助~
我知道了。我调整了代码以查看它的编译:
它编译成功!但是......还有一个问题:
使'Either a'成为一个单子,我得到'return = Right'......我怎么能得到'return = Left'?我试过这个但失败了:
或:实例 Monad (\x -> 任一个 xa)
根本不编译!
.net - 状态单子,为什么不是一个元组?
我刚刚把我的头绕在单子上(至少我想我想我有),更具体地说是状态单子,有些人比我聪明得多,所以我可能对这个问题有所了解.
无论如何,状态单子通常用 M<'a> 来实现,如下所示(F#):
现在我的问题是:你有什么理由不能在这里使用元组吗?MonadA<'a, 'b>
除此之外,和之间可能存在的歧义MonadB<'a, 'b>
都将成为等价的('a * 'b)
元组。
编辑:为清楚起见添加了示例
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 -> ...)
?
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。
haskell - monads Writer m 和 Either e 是绝对对偶的吗?
Writer m
我注意到和Either e
单子之间存在双重关系。如果 m 是一个幺半群,那么
可用于形成一个单子:
() 的对偶是 Void(空类型),积的对偶是联积。每个类型 e 都可以被赋予“comonoid”结构:
以明显的方式。现在,
这就是Either e
单子。箭头遵循完全相同的模式。
问题:是否可以编写一个通用代码来执行 asEither e
和 asWriter m
取决于给定的幺半群?
c# - Func + 扩展方法 + lambdas 中的 C# 歧义
我一直在努力完成这篇文章:
http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx
...第 1 页上的某些内容让我感到不舒服。特别是,我试图围绕 Compose<>() 函数进行思考,并为自己编写了一个示例。考虑以下两个 Func:
没问题!很容易理解这两个做什么。
现在,按照文章中的示例,您可以编写一个通用扩展方法来组合这些函数,如下所示:
美好的。所以现在你可以说:
你得到字符串“50%”
到目前为止,一切都很好。
但这里有些模棱两可。假设您编写了另一个扩展方法,那么现在您有两个函数:
这里是歧义。这两个函数没有重叠签名吗?是的。这甚至可以编译吗?是的。哪一个被调用?第二个(显然给你“错误”的结果)被调用。如果您注释掉任何一个函数,它仍然可以编译,但您会得到不同的结果。
这似乎是在吹毛求疵,但这里有一些东西深深地冒犯了我的感情,我不能指望它。它与扩展方法有关吗?它与lambda有关吗?或者它是否与 Func<> 允许您参数化返回类型有关?我不确定。
我猜这一切都在规范中的某个地方得到解决,但我什至不知道谷歌要找到什么。
帮助!
oop - 简单的英语单子?(面向没有FP背景的OOP程序员)
就 OOP 程序员可以理解的(没有任何函数式编程背景)而言,什么是 monad?
它解决了什么问题,最常见的地方是什么?
更新
为了澄清我正在寻找的那种理解,假设您正在将具有 monad 的 FP 应用程序转换为 OOP 应用程序。您将如何将 monad 的职责移植到 OOP 应用程序?
scala - 我可以将这个异步 Java 网络 API 转换为一元表示(或其他惯用的表示)吗?
我已经获得了一个 java api,用于使用基于回调的样式连接到专有总线并通过专有总线进行通信。我目前正在 scala 中实现一个概念验证应用程序,并且我正在尝试弄清楚如何生成一个稍微更惯用的 scala 界面。
一个典型的(简化的)应用程序在 Java 中可能看起来像这样:
在 scala 中,我显然可以定义从 (T => Unit) 到 IListener 的隐式转换,这无疑使事情更易于阅读:
看到这个让我想起了 scalaz promises 和 f# async 工作流。
我的问题是这样的:
我可以将其转换为理解或类似的惯用语吗(我觉得这也应该很好地映射到演员)
理想情况下,我希望看到类似的内容: