问题标签 [do-notation]

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 回答
598 浏览

if-statement - Haskell - do 块中的语法(使用 IO)

编译器说

尝试加载包含以下代码片段的文件时:

它(编译器消息)是什么意思,为什么会出现在这里?(而它不在:)

(以上示例取自http://learnyouahaskell.com/input-and-output

0 投票
1 回答
2260 浏览

haskell - where 绑定、let 绑定和单个赋值运算符 (<-) 之间的区别

我不明白这三种语法之间的区别:

  • where a = f (b)
  • do a <- f (b)
  • do let a = f (b)

a <- f(b)尽管这与其他两个不同,但我确实理解,在大多数情况下,我尝试了所有三个工作。此外,我在网上某处读到,每个块您应该尝试与一个 let 绑定相处,以便“惯用”。但我似乎从来没有管理过。

我如何决定使用什么?

0 投票
6 回答
6435 浏览

list - 在列表单子中使用 return 与不使用 return

我开始了我的 Grand Haskell Crusade (GHC :) ),我对 monads 和 IO 函数有点困惑。谁能简单地解释这两个功能之间的区别是什么?

结果是:

0 投票
7 回答
13155 浏览

haskell - 在 Haskell 中应该避免 do-notation 吗?

大多数 Haskell 教程都教给 IO 使用 do-notation。

我也从 do-notation 开始,但这使我的代码看起来更像是一种命令式语言,而不是 FP 语言。

这周我看到一个使用 IO 的教程<$>

而不是使用do

并且日志分析工具在没有do.

所以我的问题是“在任何情况下我们都应该避免做符号吗? ”。

我知道do在某些情况下可能会使代码更好。

另外,为什么大多数教程都用 IO 来教授 IO do

在我看来<$><*>并使代码比 IO 更 FP。

0 投票
3 回答
1423 浏览

haskell - Haskell do 表示法绑定

我正在尝试对 Haskell 中的 do 语句进行脱糖处理。我在 SO 上找到了一些示例,但无法将它们应用于我的案例。我唯一能想到的是一个沉重的嵌套 let 语句,这看起来很丑陋。

应将 do 表示法替换为 bind 的语句:

非常感谢任何输入=)

0 投票
2 回答
571 浏览

haskell - Haskell中的绑定与分配

我正在学习编写自己的方案教程,一个代码块让我想知道绑定和赋值之间的区别:

为什么let atom =而不是atom <-?因此,我尝试了:

我得到编译错误:

我无法准确理解这意味着什么,这可能是由于对domonad 的不精确理解。(我已经阅读了 Learn You a Haskell以及其他各种 monad/do 教程,并且其他 SO 问题指出缩进通常会导致这里出现问题,但我认为我的缩进是正确的)

0 投票
2 回答
2531 浏览

haskell - Haskell:使用 do 表示法并返回即整数值的函数

我想编写一个函数,它使用getLine并返回一个元组(整数,整数)但使用do-notation读取一些数据。像这样的东西(当然它不起作用):

我必须为此编写自己的 monad 吗?有什么不写新单子的解决方案吗?


编辑

所以我可以编写main使用的函数fun,我认为这是唯一的解决方案:

以上代码有效。

0 投票
2 回答
185 浏览

haskell - 返回从 monad 中提取的元素;多余的?

对于所有表现良好的 Monad,以下两种 flatten 实现是否等效?

0 投票
1 回答
3803 浏览

haskell - do 表示法与 let 中的模式匹配

我最近在使用threepenny-gui时遇到了一个错误 ,它通过将代码从do表示法中的<-模式匹配更改为使用let表示法的模式匹配来解决。

在这两种形式的模式匹配之间进行更改时,我是否应该期望行为发生变化?

具体如下代码:

在 IO 单子中:

改为:

这是为我解决问题的提交的链接: https ://github.com/Davorak/threepenny-gui/commit/fbf6cbe25875fafdc64f7a111ddebf485b45143b

其他平台详细信息:操作系统:10.8.5 ghc:7.6.3

编辑:添加了 IO monad 正在发生这种情况的事实

0 投票
1 回答
1047 浏览

haskell - 如何在 F# 中正确丢弃(单子)计算的结果

在 Haskell 中,我可以写:

在 F# 中,我已经走到了这一步:

换句话说,我必须引入这个未使用let! _ =的绑定来丢弃我不需要的“空间”解析器(monad)的解析值。

如何在 F# 中避免这些无用的绑定?我曾尝试使用 do!,但出现错误(因为我的>>=函数不采用类型单位,而是采用 'a):

这是我的构建器定义:

我需要定义>>功能吗?将 Combine() 添加到构建器?任何想法如何正确地做到这一点?代码示例?