gpt4 book ai didi

haskell - 为什么下面的代码无法解析?

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

以下代码不解析:

main :: IO ()
main = do
print $ result
where result = foldl' (+) 0 [1..1000000]
print $ result
where result = last [1..1000000]

编译器在第二次打印时提示: src/Main.hs:10:5: 输入“print”时解析错误

这是为什么?

最佳答案

问题是 where 子句只能附加到绑定(bind),不能附加到表达式。事实上:

main :: IO ()
main = do
print $ result
where result = foldl' (+) 0 [1..1000000]

完全等同于:

main :: IO ()
main = do
print $ result
where result = foldl' (+) 0 [1..1000000]

where 定义了 main 的本地定义,而不是 print $ result 行。由于 where 必须是绑定(bind)的最后一部分,显然以下 print 表达式会导致语法错误。

要在 do block 中使用 where,您必须在定义 let 绑定(bind)时使用它,例如这个(非常愚蠢的示例):

main = do
let result = f
where f = foldl' (+) 0 [1..1000000]
print result

您可以在 grammar 中查看:

decl    →   gendecl
| (funlhs | pat) rhs

rhs → = exp [where decls]
| gdrhs [where decls]

请注意,where declsrhs 规则的一部分,该规则定义了声明的右侧。如果您检查 exp 的规则,您将找不到提到的 where:

exp     →   infixexp :: [context =>] type       (expression type signature)
| infixexp

infixexp → lexp qop infixexp (infix operator application)
| - infixexp (prefix negation)
| lexp

lexp → \ apat1 … apatn -> exp (lambda abstraction, n ≥ 1)
| let decls in exp (let expression)
| if exp [;] then exp [;] else exp (conditional)
| case exp of { alts } (case expression)
| do { stmts } (do expression)
| fexp
fexp → [fexp] aexp (function application)

aexp → qvar (variable)
| gcon (general constructor)
| literal
| ( exp ) (parenthesized expression)
| ( exp1 , … , expk ) (tuple, k ≥ 2)
| [ exp1 , … , expk ] (list, k ≥ 1)
| [ exp1 [, exp2] .. [exp3] ] (arithmetic sequence)
| [ exp | qual1 , … , qualn ] (list comprehension, n ≥ 1)
| ( infixexp qop ) (left section)
| ( qop⟨-⟩ infixexp ) (right section)
| qcon { fbind1 , … , fbindn } (labeled construction, n ≥ 0)
| aexp⟨qcon⟩ { fbind1 , … , fbindn } (labeled update, n ≥ 1)

关于haskell - 为什么下面的代码无法解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24859287/

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