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

haskell - 为什么在像“runSomeMonad $ do ...”这样的调用中需要一个 $?

显然,唯一可能的解释runSomeMonad do ...runSomeMonad (do ...)。为什么 Haskell 语法不允许第一个变体?在某些情况下foo do bar实际上可能模棱两可吗?

0 投票
2 回答
299 浏览

haskell - 仅使用一元绑定语法表达 do 块

据我所知,doHaskell 中的块只是单子绑定运算符的某种语法糖。例如,可以转换

所有do块都可以转换为绑定语法吗?例如,这个块在哪里f被多次使用:

假设我们在 IO monad 中,不可能简单地执行readFile两次计算。这个例子(如果可能的话)如何只使用绑定语法来表达?

我认为 usingControl.Monad不是解决方案,因为它在内部使用do块。

我认为可以使用箭头(使用&&&)来表达这一点——也许这是只有箭头可以用作monads 的概括的情况

请注意,这个问题不是关于上面的特殊示例,而是关于在 monadic 表达式中多次使用计算结果的一般情况print

0 投票
2 回答
1774 浏览

haskell - Rewrite haskell list comprehension in do-notation

I have read in Learn you a Haskell, that list comprehensions in Haskell could be rewritten as monadic joins or (which is practically the same) do-notation.

However, when I try to rewrite the following code (produce all possible lists having each element from one of given lists):

in such a manner:

I get the following error:

if I change the last line of do to this: return a:[b], I don't get errors, but the result is obviously incorrect:

So the questions are:

  1. How can I rewrite this list comprehension?
  2. Are list comprehension and do-notation interchangeable, how replacement can be done generically?
0 投票
1 回答
341 浏览

haskell - 这个 getRight :: Either ab -> Maybe b 是如何工作的?

HaskellWiki 的Do notation 被认为是有害的,有用的应用程序部分,我发现:

值得一提的是,do 有时会承担你写无聊的事情的负担。

例如在

a caseon y 包括在内,如果 y 不是 Right(即 Left),则调用失败,因此在这种情况下返回 Nothing。

对模式不匹配调用fail( Nothing) 听起来很有趣,所以我想尝试一下。但是,语法看起来是错误的——我们不在Eithermonad 中,那么我们如何从中提取任何东西y呢?

事实上,我试过了,它给了我“无法将类型 `Either a' 与 `Maybe' 匹配”。所以让我们在这里使用正确的模式匹配器let

这给了我一个语法错误“输入`}'的解析错误”。并不是说我明白为什么这不起作用,但让我们用多行表示法写出来:

啊,这似乎有效 - 至少解析。然而:

是什么赋予了?所以我现在的问题是:

  • 这里发生了什么?为什么我的分号大括号行不起作用?
  • 如何正确地做到这一点(使用do,其他一切都是微不足道的)?
0 投票
2 回答
387 浏览

haskell - 理解 I/O monad 和“do”符号的使用

我仍在为 Haskell 苦苦挣扎,现在我遇到了一个问题,即从这个示例中将注意力集中在 Input/Output monad 上:

我知道因为像 Haskell 这样的函数式语言不能基于函数的副作用,所以必须发明一些解决方案。在这种情况下,似乎所有东西都必须包装在一个do块中。我得到了简单的例子,但在这种情况下,我真的需要有人解释:

  1. do为什么对 I/O 操作使用一个单独的块还不够?
  2. 为什么你必须在 if/else 情况下打开一个全新的?
  3. 另外,什么时候——我不知道怎么称呼它do——monad的“范围”结束,即你什么时候可以使用标准的Haskell术语/函数?
0 投票
2 回答
559 浏览

haskell - 如何避免 do 表示法中的多余变量?

在 Haskell do-notation 块中说,我希望有一个变量来is_root指示我是否是 root:

那个烦人uid的变量只用在那个地方。我希望我可以这样写:

但这当然不会编译。

我怎样才能摆脱多余的变量,比如uid?这是我想出的最好的:

布莱赫!有没有更好的方法?

0 投票
1 回答
112 浏览

haskell - Haskell:绑定操作中的右箭头

来自haskellwikiexpr1 >>= \x ->

我很好奇 (>>=) 运算符的右侧\x ->。这是什么意思?

\x ->GHCi也不\x承认。:type

0 投票
1 回答
260 浏览

haskell - 重构使用 Reader monad 的 Haskell 函数

我有一些看起来像这样的代码,忽略了所有与我的问题无关的代码:

有没有办法重构这个?具体来说,嵌套bar'函数最困扰我。这可以浓缩成一行吗?

0 投票
2 回答
213 浏览

function - 如何从 Haskell 中带参数的函数中绘制?

我知道在一个do块内我可以从一元的东西中提取,“提取”它的内容。例如,如果我有一个带有签名的函数:

我可以在一个do块内做到这一点:

这会给我Set Int我想要的。但是,如果我更改函数以使其接受参数:

我不能再做我想做的事了:

这无法编译并出现错误Couldn't match expected typeProbable cause: ‘myFunction'’ is applied to too few arguments. 尝试这样的事情甚至在语法上都不正确:

我确实想myFunction'成为类型Int -> Set Int。我无法弄清楚或找到任何地方如何做我想做的事。有人可以帮忙吗?

0 投票
1 回答
1818 浏览

haskell - do 语句中的 if/then/else (Haskell)

我有一个我写的代码块不能编译,因为 if/then/else 块没有以编译器理解的方式设置,但是我不知道如何重写它所以它可以。

基本上,uniform如果列表为空,该函数将除以零,所以我需要一种方法来捕获它并在继续执行 do 语句之前返回空列表。有什么建议吗?