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

scala - scala Iterable#map 与 Iterable#flatMap

map和的flatMap功能有什么区别Iterable

0 投票
3 回答
976 浏览

haskell - 如何在 Haskell 中以隐藏的方式初始化状态(就像 PRNG 一样)?

我浏览了一些关于 State monad 的教程,我想我明白了。

例如,在这个不错的教程中:

好的,所以我可以使用 getRandom:

但是我每次调用它时仍然需要将种子传递给 PRNG。我知道 Haskell 实现中可用的 PRNG 不需要:

所以我可能误解了 State monad,因为我在大多数教程中看到的似乎不是“持久”状态,而只是一种方便的线程状态方式。

那么......我怎样才能拥有自动初始化的状态(可能来自使用时间和其他不可预测数据的某些函数),就像 Random 模块一样?

非常感谢!

0 投票
3 回答
5951 浏览

haskell - How do I combine monads in Haskell?

Particularly, I need to be able to combine the CGI monad with the IO monad, but an example of how to combine the IO monad with the Maybe monad might be even better...

0 投票
5 回答
3241 浏览

haskell - Haskell: monadic takeWhile?

我有一些从 Haskell 调用的用 C 语言编写的函数。这些函数返回IO (CInt). 有时我想运行所有函数,而不管它们返回什么,这很容易。为了示例代码,这是当前正在发生的事情的一般概念:

我得到了我想要的副作用,我不在乎结果。但是现在我需要在第一个没有返回我想要的结果的项目之后立即停止执行。假设返回值 4 或更高需要停止执行 - 那么我想要做的是:

这给了我这个错误:

这对我来说很有意义——结果仍然包含在 IO monad 中,我不能只比较 IO monad 中包含的两个值。我知道这正是 monad 的目的——将结果链接在一起并在满足某个条件时丢弃操作——但是在这种情况下是否有一种简单的方法可以“包装” IO monad 以在某个条件下停止执行链我选择的,没有写一个实例MonadPlus

为了 takeWhile 的目的,我可以从f中“取消”这些值吗?

这是适合函子的解决方案吗?Functors 还没有和我一起“点击”,但我有一种印象,这可能是使用它们的好情况。


更新:

@sth 有我想要的最接近的答案 - 事实上,这几乎正是我想要的,但我仍然想看看是否有一个标准解决方案不是明确递归的 - 这是 Haskell,之后全部!回顾我如何表达我的问题,现在我可以看到我对我想要的行为不够清楚。

f我上面用于示例的函数只是一个示例。真正的函数是用 C 语言编写的,专门用于它们的副作用。我不能使用@Tom 的建议,mapM_ f (takeWhile (<4) [0..5])因为在执行之前我不知道任何输入是否真的会导致成功或失败。

我实际上也不关心返回的列表——我只想调用 C 函数,直到列表用尽或第一个 C 函数返回失败代码。

在 C 风格的伪代码中,我的行为是:

同样,@sth 的答案执行了我想要的确切行为,除了结果可能(应该?)被丢弃。一个dropWhileM_函数对于我的目的来说是等价的。takeWhileM_为什么在 Control.Monad中没有这样的函数?我看到在邮件列表上有类似的讨论,但似乎没有任何结果。

0 投票
3 回答
3178 浏览

syntax - Haskell:我可以在带有绑定运算符(>>=)的块之后使用 where 子句吗?

我有一个非常简单的问题。我想在使用绑定运算符的代码块之后使用 where 子句,但出现编译错误。

这是一个简单的例子:

我可以对 list' 使用 let 子句,如

但如果我可以使用 where 子句,我真的很喜欢它......

我也尝试过使用 do 表示法

同样的问题。在这些情况下我可以使用 where 子句吗?

0 投票
2 回答
819 浏览

haskell - 单子中的值,嵌套在数据结构中?

假设在 Haskell 程序中,我有一些数据,其类型类似于:

  • IO [ IO (Int, String, Int) ], 或者
  • IO [ (Int, String, IO Int) ], 或者
  • [ (Int, String, IO Int) ]

但我有纯函数应该在[ (Int, String, Int) ]. 看来我必须笨拙地从 IO monad 中删除内部值,直到我得到类似 IO [ (Int, string, Int) ] 的东西,然后(从 IO monad 内部)应用纯函数。我想没有简单的预定义方法可以做到这一点?将整个数据结构提升为 monad,将所有内部类型转换为纯类型的东西?(那会很方便!)

0 投票
8 回答
11391 浏览

c# - 在 C# 中恶意使用 Maybe monad 和扩展方法?

编辑 2015这个问题及其答案不再相关。在 C# 6 出现之前就有人问过它,它具有空传播操作符 (?.),它避免了在这个问题和后续答案中讨论的 hacky-workarounds。截至 2015 年,在 C# 中,您现在应该使用 Form.ActiveForm?.ActiveControl?.Name。


我一直在考虑 .NET 中的 null 传播问题,这通常会导致丑陋的重复代码,如下所示:

尝试 #1 常用代码:

StackOverflow 上有一些关于 Maybe<T> monad 的讨论,或者使用某种“if not null”扩展方法:

尝试#2,扩展方法:

我认为这更好,但是,重复的“IfNotNull”和 lambda 有点语法混乱。我现在正在考虑这个设计:

尝试 #3,Maybe<T> 与扩展方法

我的问题是:这是对扩展方法的恶意滥用吗?它比旧的通常的空检查更好吗?

0 投票
2 回答
916 浏览

haskell - 简化一些 Haskell 代码

因此,我正在为类似跳棋的游戏开发极小极大实现,以帮助自己更好地学习 Haskell。我遇到问题的函数需要一个游戏状态列表,并生成直接后继游戏状态的列表。像跳棋一样,如果可以跳,玩家必须跳。如果有多个,玩家可以选择。

在大多数情况下,这与 list monad 配合得很好:遍历所有输入游戏状态,遍历所有可以跳跃的弹珠,遍历该弹珠的所有跳跃。这个列表单子很好地将所有列表扁平化为最后的简单状态列表。

诀窍是,如果没有找到给定游戏状态的跳转,我需要返回当前游戏状态,而不是空列表。下面的代码是我想出的最好的方法,但它对我来说真的很难看。关于如何清理它的任何建议?

编辑:为 *Hex 函数提供示例类型签名。

0 投票
3 回答
337 浏览

monads - 纯函数式编程语言中的副作用方法

目前,我知道将副作用集成到纯函数式编程语言中的以下方法:

  • 效果系统
  • 继续
  • 独特的类型
  • 单子

单子经常被认为是最有效和最通用的方法。

还存在哪些其他方法?他们如何比较?

0 投票
3 回答
1298 浏览

haskell - 使用 State monad 还是递归传递 state 更好?

我只是在学习 Haskell,并试图找出实现视线算法的最惯用的方法。

我找到的演示代码使用了 state monad,但对我来说(我只是一个初学者)递归地传递 state 似乎更简单。我在这里想念什么?是否存在性能问题?

在以下位置查找代码:http ://www.finalcog.com/bresenham-algorithm-idiomatic-haskell

谢谢,

克里斯。