gpt4 book ai didi

haskell - where 绑定(bind)、let 绑定(bind)和单个赋值运算符 (<-) 之间的区别

转载 作者:行者123 更新时间:2023-12-03 21:21:33 27 4
gpt4 key购买 nike

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

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

  • 我确实明白了 a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有三个工作。此外,我在网上某处读到,每个 block 您应该尝试与一个 let 绑定(bind)相处,以便“惯用”。但我似乎从来没有管理过。

    我如何决定使用什么?

    最佳答案

    let foo = bar in ...简单定义 foobar 完全相同在 ... 的上下文中;您可以简单地使用文本替换来替换 foo 的所有用法在 ...(bar)并得到完全相同的结果。
    where子句类似于 let...in表达式,但放在函数子句的末尾,而不是表达式。例如,

    foo x
    | p1 = ... y ...
    | p2 = ... y ...
    where
    y = ...

    没有办法用 let...in 重写它无需将 guard 更改为 if...then...else s。通常, where子句用于 let...in条款纯粹是出于风格的原因。

    绑定(bind)运算符完全不同。用于 do从一元计算中“提取”一个值的符号。也就是说,如果 foo类型为 m a ,然后在 x <- foo 之后, x类型为 a .所有其他“绑定(bind)”形式只是定义名称,但 <-用于将计算结果绑定(bind)到 monad 中的名称。 <-只能在 do 内使用 block ,因此它专门用于在与您绑定(bind)结果的操作相同的单子(monad)中建立更大的计算。
    let foo = bardo符号只是一种方便;你可以重写:
    do let foo = bar
    ...

    作为
    let foo = bar
    in do ...

    但是当你有很多这样的绑定(bind)时就​​会变得困惑,比如 do block 嵌套越来越深。

    我不知道你提到的建议在说什么;您可以在 let...in 中定义多个变量阻止就好了,并且
    let foo = ...
    bar ...
    in ...


    let foo = ...
    in let bar = ...
    in ...

    关于haskell - where 绑定(bind)、let 绑定(bind)和单个赋值运算符 (<-) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254124/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com