问题标签 [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 回答
268 浏览

haskell - 这个 Haskell 输入缩进有什么问题?

在下面的 Haskell 代码中,我收到一个错误“输入 'in' 上的解析错误”。根据我的阅读,我使用的缩进应该没问题。事实上,我在代码的其他地方成功地使用了具有类似缩进的 'let' 和 'in'('let' 与 'in' 对齐)。我打破了什么规则导致这个“进入”成为一个问题?如果我在'in'前面添加一个空格(使其比'let'多1个空格)它编译得很好。

感谢所有帮助。提前致谢。

0 投票
1 回答
905 浏览

haskell - do 块内的执行顺序是否真的不依赖于语句顺序?

我正在阅读https://wiki.haskell.org/Do_notation_considered_harmful并惊讶地阅读以下几行

新手可能会认为语句的顺序决定了执行的顺序。...语句的顺序也不是评估顺序的标准。

wiki 帖子提供了一些示例来演示此属性。虽然这些例子是有道理的,但我仍然不完全相信这个陈述是真的,因为如果我写了类似的东西

这三行按语句的顺序出现。那么这里到底发生了什么?

0 投票
1 回答
136 浏览

haskell - 理解 do 表示法和绑定

我对 haskell 非常陌生,我正在尝试了解用于在本文档中创建 Monadic 解析器的方法https://www.cs.nott.ac.uk/~gmh/pearl.pdf

为了正确理解它,我没有完全遵循它,而是尝试做一些不同的事情,因此,我最终得到了这段代码

这似乎有效,但我很难理解 do 表示法中发生的事情。

例如; 在c1 <- item,分配给c1什么?它是包含在Parser类型中的函数,还是计算的结果,还是其他什么?此外, do 表示法中的第二行是 just item,所以它只是运行item但不分配结果吗?最后,return (c1,c2)产生什么?是Parser (String -> Maybe ((c1, c2)), String)还是只是Just (c1, c2)

0 投票
1 回答
123 浏览

haskell - 为什么monad类型类中应该存在fail方法?

所以我有这行代码:

这当然给出了例外,因为模式不匹配任何内容。

另一方面,这段代码给出了不同的结果,[]:

正如我所看到的,它们应该产生相同的结果,因为应该将 do-blocks 减少为使用 (>>=) 并返回。但事实并非如此,使 do-notation 成为一种功能而不是语法糖。

我知道 monad 类型类中存在 fail 并且我知道当模式匹配在 do-block 中失败时会调用它,但我不明白为什么它是一种与使用普通 monad 操作不同的想要的行为。

所以我的问题是 - 为什么失败方法应该存在?

0 投票
2 回答
533 浏览

haskell - Haskell中do-notation中变量的类型是什么?

下面的代码看起来很清楚:

这里xisNumyis的类型String。(<-这里用于从 Monad 中取出实际值)

但是,这个片段对我来说似乎不太清楚:

这里的类型a和类型是b什么?看起来他们的行为就像一个Num,但是在a <- (* 2)这里b <- (+ 10)看起来很神秘......

有人对此有想法吗?

0 投票
3 回答
313 浏览

haskell - 将函数应用程序的结果存储在 DO 块内的元组中

虽然我可以应用一个函数两次并将结果绑定到一个元组中:

do这不能在一个块内完成(至少我不知道如何正确地做到这一点) :

输入 GHCI REPL 时出现以下错误:

我显然可以用更详细的方法来解决它:

有没有一种正确的表达方式test而不是让它喜欢test'

0 投票
2 回答
3745 浏览

haskell - let 语句中的 case 语句需要什么缩进?

在 haskell 工作,发现奇怪的行为,将其剥离为裸露的骨头

这个作品

但是当我尝试

我明白了

所以我尝试

这有效。

什么?为什么?在这种情况下,为什么我需要额外的缩进?我在这方面找不到任何东西,可能是因为这些关键字在日常语言中是如此简短和常见。是否有一些规范可以解释这种行为?

0 投票
1 回答
196 浏览

haskell - 在 let 中使用 Monadic do 表示法,这可能吗?

考虑以下有效的 Haskell 代码

函数f可以用这样的 do-notation 等效地重写

让我烦恼的是,当我将内联的内容放入时,do 表示法不起作用f。以下代码甚至不解析:

我是否正确,let我被迫诉诸于内心(>>=)

当我这样做时,以下代码也不会解析:

除了let. 有没有优雅的使用方式bindinside let

0 投票
3 回答
418 浏览

haskell - 在 do 表示法中将单子函数与纯函数混合

我无法在 do 表示法中混合纯函数和单子函数。我有一种感觉,我错过了一些明显的东西。

例如,假设我有这些功能

这不起作用,因为

行在 z 中,但是将纯 fb 函数与一元 fa 和 fc 函数结合起来的优雅方式是什么?

0 投票
3 回答
143 浏览

haskell - 添加操作而不更改结果以重构 do-notation

我想在 Haskell 中按顺序组合两个 monad 动作,丢弃第二个产生的任何值,并将参数传递给这两个动作。目前我正在使用这样的do-block:

我希望写这个更自由和整洁,所以我尝试了这个:

但是,这甚至没有类型检查,问题是<*不会将第一个操作的结果传输到第二个操作。我想像这样链接动作>>=,但不改变结果。类型应该是(a -> m b) -> (a -> m c) -> (a -> m b),但Hoogle没有产生合适的结果。实现此功能组合的运算符是什么?