绑定,绑定和单个赋值运算符(< - )之间的区别

J F*_*sch 14 haskell

我不明白这三种语法之间的区别:

  • where a = f (b)
  • do a <- f (b)
  • do let a = f (b)

我确实理解,虽然这a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有三个工作.另外,我在网上的某个地方读到了每个块,你应该尝试与一个让绑定相处,只是为了"惯用".但我似乎永远不会管理.

我该如何决定使用什么?

ehi*_*ird 26

let foo = bar in ...简单地定义foobar与上下文完全相同的东西...; 你可以简单地使用文本替换替换的所有使用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 = bardo表示法只是一个方便; 你可以改写:

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)