问题标签 [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.
haskell - 为什么在像“runSomeMonad $ do ...”这样的调用中需要一个 $?
显然,唯一可能的解释runSomeMonad do ...
是runSomeMonad (do ...)
。为什么 Haskell 语法不允许第一个变体?在某些情况下foo do bar
实际上可能模棱两可吗?
haskell - 仅使用一元绑定语法表达 do 块
据我所知,do
Haskell 中的块只是单子绑定运算符的某种语法糖。例如,可以转换
至
所有do
块都可以转换为绑定语法吗?例如,这个块在哪里f
被多次使用:
假设我们在 IO monad 中,不可能简单地执行readFile
两次计算。这个例子(如果可能的话)如何只使用绑定语法来表达?
我认为 usingControl.Monad
不是解决方案,因为它在内部使用do
块。
我认为可以使用箭头(使用&&&
)来表达这一点——也许这是只有箭头可以用作monads 的概括的情况?
请注意,这个问题不是关于上面的特殊示例,而是关于在 monadic 表达式中多次使用计算结果的一般情况print
。
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:
- How can I rewrite this list comprehension?
- Are list comprehension and do-notation interchangeable, how replacement can be done generically?
haskell - 这个 getRight :: Either ab -> Maybe b 是如何工作的?
在HaskellWiki 的Do notation 被认为是有害的,有用的应用程序部分,我发现:
值得一提的是,do 有时会承担你写无聊的事情的负担。
例如在
a
case
on y 包括在内,如果 y 不是 Right(即 Left),则调用失败,因此在这种情况下返回 Nothing。
对模式不匹配调用fail
( Nothing
) 听起来很有趣,所以我想尝试一下。但是,语法看起来是错误的——我们不在Either
monad 中,那么我们如何从中提取任何东西y
呢?
事实上,我试过了,它给了我“无法将类型 `Either a' 与 `Maybe' 匹配”。所以让我们在这里使用正确的模式匹配器let
:
这给了我一个语法错误“输入`}'的解析错误”。并不是说我明白为什么这不起作用,但让我们用多行表示法写出来:
啊,这似乎有效 - 至少解析。然而:
是什么赋予了?所以我现在的问题是:
- 这里发生了什么?为什么我的分号大括号行不起作用?
- 如何正确地做到这一点(使用
do
,其他一切都是微不足道的)?
haskell - 理解 I/O monad 和“do”符号的使用
我仍在为 Haskell 苦苦挣扎,现在我遇到了一个问题,即从这个示例中将注意力集中在 Input/Output monad 上:
我知道因为像 Haskell 这样的函数式语言不能基于函数的副作用,所以必须发明一些解决方案。在这种情况下,似乎所有东西都必须包装在一个do
块中。我得到了简单的例子,但在这种情况下,我真的需要有人解释:
do
为什么对 I/O 操作使用一个单独的块还不够?- 为什么你必须在 if/else 情况下打开一个全新的?
- 另外,什么时候——我不知道怎么称呼它
do
——monad的“范围”结束,即你什么时候可以使用标准的Haskell术语/函数?
haskell - 如何避免 do 表示法中的多余变量?
在 Haskell do-notation 块中说,我希望有一个变量来is_root
指示我是否是 root:
那个烦人uid
的变量只用在那个地方。我希望我可以这样写:
但这当然不会编译。
我怎样才能摆脱多余的变量,比如uid
?这是我想出的最好的:
布莱赫!有没有更好的方法?
haskell - 重构使用 Reader monad 的 Haskell 函数
我有一些看起来像这样的代码,忽略了所有与我的问题无关的代码:
有没有办法重构这个?具体来说,嵌套bar'
函数最困扰我。这可以浓缩成一行吗?
function - 如何从 Haskell 中带参数的函数中绘制?
我知道在一个do
块内我可以从一元的东西中提取,“提取”它的内容。例如,如果我有一个带有签名的函数:
我可以在一个do
块内做到这一点:
这会给我Set Int
我想要的。但是,如果我更改函数以使其接受参数:
我不能再做我想做的事了:
这无法编译并出现错误Couldn't match expected type
和Probable cause: ‘myFunction'’ is applied to too few arguments
. 尝试这样的事情甚至在语法上都不正确:
我确实想myFunction'
成为类型Int -> Set Int
。我无法弄清楚或找到任何地方如何做我想做的事。有人可以帮忙吗?
haskell - do 语句中的 if/then/else (Haskell)
我有一个我写的代码块不能编译,因为 if/then/else 块没有以编译器理解的方式设置,但是我不知道如何重写它所以它可以。
基本上,uniform
如果列表为空,该函数将除以零,所以我需要一种方法来捕获它并在继续执行 do 语句之前返回空列表。有什么建议吗?