haskell - Haskell 程序员的计算表达式

标签 haskell f# monads computation-expression

我正在寻找学习 F#,但让我感到困惑的一件事是计算表达式(do-notation??)语法和脱糖。

在 haskell 中,您有一个非常简单的 Monad 类型类和将 do-notation 脱糖到 bind 和 return 的规则。添加关键字没有魔法。唯一必须匹配的是类型。

在 F# 中有一堆构建器、关键字和复杂性。

关于如何将一个概念映射到另一个概念是否有很好的解释?

我基本上想知道我如何映射

do
  x <- monadicComputation
  foo x
  someOtherMonadicComputation
  let y = somePureComputation x
  return $ bar y

到F#。

haskell 中唯一的关键字是 do、(<-) 和 let。

最佳答案

您不能在 F# 中编写通用 monad 代码,而是必须通过命名与表达式关联的构建器来指定您正在使用的 monad。您的示例代码如下所示:

let example = async {
    let! a = someAsyncComputation
    foo a
    do! someOtherAsyncComputation
    let y = somePureComputation a
    return (bar y)
}

对于async计算表达式类型。 'bang' 模式(do!、let! 等)用于绑定(bind) monadic 值,而常规关键字用于非 monadic 值。
let!对应绑定(bind)(>>=)let对应于 letdo符号。 return对应于 return , 而 return!用于产生现有的一元值。 do!类似于 (>>)它对其效果执行一元值,而 do用于非单子(monad)效果,在 Haskell 中没有类似的效果。

关于haskell - Haskell 程序员的计算表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19586825/

相关文章:

haskell - xmonad 的 logHook 可以按设定的时间间隔运行,而不是(仅仅)响应布局事件吗?

haskell - 将 do by >>= 替换为 scotty post

F# 错误 : This value is not a function and cannot be applied

haskell - 关于函数 monad

haskell - 将类型级别列表转换为值

haskell - 如何求和{getSum = 0}?

f# - 为什么 F# Powerpack 中矩阵和向量类型的元素是可变的?

f# - 如何在 F# 中实现定点运算符(Y 组合器)?

scala - (如何)你能 curry 组成一元函数吗?

haskell - 用 Haskell 编写的简单解释器,将打印输出保存到最后,而不是遇到打印语句时