我正在寻找学习 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
对应于 let
在 do
符号。 return
对应于 return
, 而 return!
用于产生现有的一元值。 do!
类似于 (>>)
它对其效果执行一元值,而 do
用于非单子(monad)效果,在 Haskell 中没有类似的效果。
关于haskell - Haskell 程序员的计算表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19586825/