问题标签 [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.
ruby - Ruby 中的 Monad 等价物
在 Ruby 中,monad 的等效构造是什么?
haskell - Haskell 和随机数
几天来我一直在搞乱Haskell,偶然发现了一个问题。
我需要一个返回随机整数列表的方法( Rand [[Int]] )。
所以,我定义了一个类型:type Rand a = StdGen -> (a, StdGen)
. 我能够以某种方式产生Rand IO Integer
和Rand [IO Integer]
((returnR lst) :: StdGen -> ([IO Integer], StdGen)
)。任何提示如何生产Rand [[Int]]
?
design-patterns - 有没有人在野外遇到过 Monad Transformer?
在我的业务领域 - 金融机构的后台 IT - 软件组件携带全局配置,记录其进度,进行某种错误处理/计算短路是很常见的......可以在 Haskell 中由 Reader-、Writer-、Maybe-monad 等很好地建模,并与 monad 转换器组合在一起。
但似乎有一些缺点:monad 转换器背后的概念非常棘手且难以理解,monad 转换器会导致非常复杂的类型签名,并且会造成一些性能损失。
所以我想知道:处理上述常见任务时,monad 转换器是最佳实践吗?
haskell - mtl、transformers、monads-fd、monadLib 和选择悖论
Hackage 有几个用于 monad 转换器的包:
- mtl : Monad 转换器库
- 变压器:具体函子和单子变压器
- monads-fd : Monad 类,使用函数依赖
- monads-tf : Monad 类,使用类型族
- monadLib:monad 转换器的集合。
- mtl-tf:使用类型族的 Monad 转换器库。
- mmtl : 模块化 Monad 变压器库
- mtlx:具有类型索引的 Monad 转换器库,提供“免费”副本。
- compose-trans : 可组合的 monad 转换器
(也许我错过了一些)
我们应该使用哪一个?
mtl 是 Haskell 平台中的一个,但我一直在 reddit 上听到它不酷。
但是无论如何选择有什么不好的,这不只是一件好事吗?
好吧,我看到了例如 data-accessor 的作者如何不得不做出所有这些来迎合流行的选择:
- data-accessor-monadLib 库:monadLib 的 monad 的访问器函数
- data-accessor-monads-fd 库:使用 Accessor 访问 monads-fd State monad 类中的状态
- data-accessor-monads-tf 库:使用 Accessor 访问 monads-tf State monad 类型族中的状态
- data-accessor-mtl 库:使用 Accessor 访问 mtl State monad 类中的状态
- data-accessor-transformers 库:使用 Accessor 访问变压器状态单子中的状态
我想如果这种情况继续下去,例如几个相互竞争的 Arrow 包演变,我们可能会看到类似的东西:spoonklink-arrows-transformers、spoonklink-arrows-monadLib、spoonklink-tfArrows-transformers、spoonklink-tfArrows-monadLib,...
然后我担心如果spoonklink 被分叉,Hackage 会耗尽磁盘空间。:)
问题:
- 为什么有这么多单子变压器包?
- 为什么 mtl [认为] 不酷?
- 主要区别是什么?
- 大多数这些看似相互竞争的软件包都是由 Andy Gill 编写的,并由 Ross Paterson 维护。这是否意味着这些软件包不是相互竞争而是以某种方式协同工作?Andy 和 Ross 是否认为他们自己的软件包已经过时?
- 你和我应该使用哪一个?
haskell - Haskell 的 monad 可以被认为是使用和返回隐藏状态参数吗?
我不了解 Haskell 单子背后的确切代数和理论。然而,当我考虑一般的函数式编程时,我得到的印象是,状态将通过获取初始状态并生成它的副本来表示下一个状态来建模。这就像将一个列表附加到另一个列表时一样;两个列表都没有被修改,但第三个列表被创建并返回。
因此,将一元操作视为隐式地将初始状态对象作为参数并隐式返回最终状态对象是否有效?这些状态对象将被隐藏,这样程序员就不必担心它们并控制它们的访问方式。因此,程序员不会像十分钟前那样尝试复制表示 IO 流的对象。
换句话说,如果我们有这个代码:
...可以将 IO monad 和“do”语法视为代表这种代码风格吗?
performance - 在 Haskell 中循环未装箱数组的性能
首先,它很棒。但是,我遇到了一种情况,我的基准测试结果很奇怪。我是 Haskell 的新手,这是我第一次接触可变数组和 Monad。下面的代码是基于这个例子。
我写了一个通用的单子for
函数,它接受数字和一个阶跃函数而不是一个范围(就像forM_
那样)。我将使用我的通用for
函数(循环 A)与嵌入等效递归函数(循环 B)进行了比较。拥有循环 A 明显快于拥有循环 B。更奇怪的是,同时拥有循环 A 和 B 比单独拥有循环 B 更快(但比单独拥有循环 A 稍慢)。
对于这些差异,我能想到一些可能的解释。请注意,这些只是猜测:
- 关于 Haskell 如何从 monadic 函数中提取结果,我还没有学到一些东西。
- 与循环 A 相比,循环 B 以较低缓存效率的方式对阵列进行故障处理。为什么?
- 我犯了一个愚蠢的错误;Loop A 和 Loop B 实际上是不同的。
- 请注意,在具有循环 A 和循环 B 之一或两者的所有 3 种情况下,程序产生相同的输出。
这是代码。我ghc -O2 for.hs
使用 GHC 版本 6.10.4 对其进行了测试。
haskell - do-notation 是否特定于“base:GHC.Base.Monad”?
Monad
标准类是有缺陷的,它实际上应该扩展Functor
或Pointed
浮动的想法。
我不一定声称这是正确的做法,但假设有人试图这样做:
到目前为止一切顺利,但是当尝试使用 do-notation 时:
编译器抱怨:
问题:
do-notation 仅适用于base:GHC.Base.Monad
吗?有没有办法让它与替代Monad
类一起工作?
额外的上下文:
我真正想做的是base:Control.Arrow.Arrow
用“通用”Arrow
类替换:
然后在Arrow
我的课程中使用 's proc-notation Arrow
,但这就像上面的 do-notation 示例和Monad
.
我将主要Either
用作我的对类型构造函数,而不是(,)
像当前Arrow
类那样的类型构造函数。这可能会使我的玩具 RTS 游戏 ( cabal install DefendTheKind
) 的代码更漂亮。
haskell - 将 IO 输出收集到列表中
如何发出多个调用SDL.pollEvent :: IO Event
直到输出SDL.NoEvent
并将所有结果收集到一个列表中?
在命令式术语中是这样的:
haskell - 在 Haskell 中避免显式递归
下面的简单函数迭代地应用给定的一元函数,直到它遇到一个 Nothing,此时它返回最后一个非 Nothing 值。它可以满足我的需要,并且我了解它的工作原理。
作为我在 Haskell 中自我教育的一部分,我试图尽可能避免显式递归(或至少了解如何)。在这种情况下,似乎应该有一个简单的非显式递归解决方案,但我无法弄清楚。
我不想要像monadic 版本的东西takeWhile
,因为收集所有 pre-Nothing 值可能很昂贵,而且我也不关心它们。
我检查了 Hoogle 的签名,没有任何显示。这m (Maybe a)
一点让我觉得 monad 转换器在这里可能有用,但我真的没有直觉我需要想出细节(还)。
这样做可能很容易令人尴尬,或者很容易看出为什么不能或不应该这样做,但这不是我第一次将自我尴尬作为一种教学策略。
更新:我当然可以提供一个谓词而不是使用Maybe
: 之类的东西(a -> Bool) -> (a -> m a) -> a
(返回谓词为真的最后一个值)也可以。我感兴趣的是一种使用标准组合器在没有显式递归的情况下编写任一版本的方法。
背景:这是一个简化的上下文示例:假设我们对单位正方形中的随机游走感兴趣,但我们只关心出口点。我们有以下阶跃函数:
类似的东西evalState (lastJustM (randomStep 0.01) (0.5, 0.5)) <$> newStdGen
会给我们一个新的数据点。
haskell - 在 Haskell 中链接/组合类型类
假设我有两个类型类定义如下,它们功能相同但名称不同:
有没有办法将这两个类联系在一起,所以作为 PhantomMonad 实例的东西将自动成为 Monad 的实例,或者每个类的实例都必须显式编写?任何见解将不胜感激,谢谢!