gpt4 book ai didi

haskell - 在 Haskell 中,我们什么时候使用 in 和 let ?

转载 作者:行者123 更新时间:2023-12-02 22:17:38 26 4
gpt4 key购买 nike

在下面的代码中,最后一个短语我可以在前面放一个in。它会改变什么吗?

另一个问题:如果我决定将 in 放在最后一个短语前面,是否需要缩进?

我尝试不缩进并拥抱提示

Last generator in do {...} must be an expression

import Data.Char
groupsOf _ [] = []
groupsOf n xs =
take n xs : groupsOf n ( tail xs )

problem_8 x = maximum . map product . groupsOf 5 $ x
main = do t <- readFile "p8.log"
let digits = map digitToInt $concat $ lines t
print $ problem_8 digits
<小时/>

编辑

好吧,所以人们似乎不明白我在说什么。让我重新表述一下:根据上面的上下文,以下两个是否相同?

1.

let digits = map digitToInt $concat $ lines t
print $ problem_8 digits

2.

let digits = map digitToInt $concat $ lines t
in print $ problem_8 digits

关于 let 中声明的绑定(bind)范围的另一个问题:我读过 here那:

where Clauses.

有时,在多个 protected 方程上设置绑定(bind)范围很方便,这需要一个 where 子句:

f x y  |  y>z           =  ...
| y==z = ...
| y<z = ...
where z = x*x

请注意,这不能使用 let 表达式来完成,let 表达式的范围仅限于它所包含的表达式

我的问题:所以,可变数字对于最后一个打印短语不应该是可见的。我在这里错过了什么吗?

最佳答案

简短回答:使用let没有in在 do block 的主体中​​,以及 | 之后的部分中在列表理解中。在其他地方,请使用 let ... in ... .

<小时/>

关键字let在 Haskell 中以三种方式使用。

  1. 第一种形式是 let 表达式

    let variable = expression in expression

    这可以在任何允许表达式的地方使用,例如

    > (let x = 2 in x*2) + 3
    7
  2. 第二个是 let 语句。该形式仅在 do 表示法内部使用,不使用 in .

    do statements
    let variable = expression
    statements
  3. 第三个与数字 2 类似,用在列表推导式内部。再说一遍,不in .

    > [(x, y) | x <- [1..3], let y = 2*x]
    [(1,2),(2,4),(3,6)]

    此形式绑定(bind)一个变量,该变量位于后续生成器的范围内以及 | 之前的表达式中。 .

<小时/>

您在这里感到困惑的原因是表达式(正确类型的)可以用作 do block 中的语句,并且 let .. in ..只是一个表达式。

由于haskell的缩进规则,比前一行缩进的行意味着它是前一行的延续,所以这样

do let x = 42 in
foo

被解析为

do (let x = 42 in foo)

如果没有缩进,您会收到解析错误:

do (let x = 42 in)
foo

总之,永远不要使用in在列表理解或 do block 中。这是不必要且令人困惑的,因为这些构造已经有自己的 let 形式。 .

关于haskell - 在 Haskell 中,我们什么时候使用 in 和 let ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274650/

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