我不明白这三种语法之间的区别:
where a = f (b)do a <- f (b)do let a = f (b)我确实理解,虽然这a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有三个工作.另外,我在网上的某个地方读到了每个块,你应该尝试与一个让绑定相处,只是为了"惯用".但我似乎永远不会管理.
我该如何决定使用什么?
ehi*_*ird 26
let foo = bar in ...简单地定义foo为bar与上下文完全相同的东西...; 你可以简单地使用文本替换替换的所有使用foo中...与(bar)并得到完全相同的结果.
where子句与let...in表达式类似,但是在函数子句的末尾,而不是表达式.例如,
foo x
| p1 = ... y ...
| p2 = ... y ...
where
y = ...
Run Code Online (Sandbox Code Playgroud)
let...in如果不将防守改为if...then...elses,就无法重写.通常,where条款let...in仅仅出于风格的原因而在条款中使用.
绑定运算符完全不同.它用于do表示从一元计算中"提取"一个值.也就是说,如果foo有类型m a,那么之后x <- foo,x有类型a.所有其他"绑定"表单只定义名称,但<-用于将计算结果绑定到monad中的名称.<-只能在一个do块中使用,因此它专门用于在与绑定结果的动作相同的monad中构建更大的计算.
let foo = bar在do表示法只是一个方便; 你可以改写:
do let foo = bar
...
Run Code Online (Sandbox Code Playgroud)
如
let foo = bar
in do ...
Run Code Online (Sandbox Code Playgroud)
但是当你有很多这样的绑定时会变得混乱,因为do块越来越深.
我不知道你提到的建议在谈论什么; 你可以在一个let...in块中定义多个变量就好了
let foo = ...
bar ...
in ...
Run Code Online (Sandbox Code Playgroud)
比起来更习惯
let foo = ...
in let bar = ...
in ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |