为什么以下代码无法解析?

yong

以下代码无法解析:

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子句只能附加到绑定,不能附加到表达式事实上:

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必须是绑定的最后一部分,因此以下print表达式显然会导致语法错误。

wheredo-block内部使用,您必须在定义let此类绑定时使用它(非常愚蠢的示例):

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

您可以在语法中检查此内容

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) 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么以下代码无法编译?

来自分类Dev

为什么以下代码段无法成功运行?

来自分类Dev

为什么以下代码无法按预期执行?

来自分类Dev

为什么以下代码会运行?

来自分类Dev

为什么以下代码显示错误?

来自分类Dev

为什么以下代码不终止?

来自分类Dev

Java类型清除:为什么以下代码段无法编译?

来自分类Dev

为什么在以下代码中无法投射类型为'WhereSelectEnumerableIterator的对象?

来自分类Dev

为什么在以下代码段中无法访问from的变量值?

来自分类Dev

为什么他的以下代码无法在链表中的特定位置插入节点?

来自分类Dev

无法理解为什么在运行以下代码时应用程序崩溃

来自分类Dev

以下代码段的输出是什么,为什么?

来自分类Dev

以下代码的输出是什么,为什么?

来自分类Dev

为什么以下代码会导致无限递归?

来自分类Dev

为什么clang ++不编译以下代码?

来自分类Dev

为什么以下代码编译和执行成功?

来自分类Dev

为什么以下代码打印出10而不是null?

来自分类Dev

Sailsjs:以下代码中为什么不使用* return *?

来自分类Dev

以下代码不起作用..为什么?

来自分类Dev

为什么以下代码导致模板实例化?

来自分类Dev

为什么以下代码在C ++中是非法的

来自分类Dev

为什么以下代码给出此输出?

来自分类Dev

为什么在以下代码中出现竞争条件?

来自分类Dev

为什么我将nan作为以下代码的输出?

来自分类Dev

为什么以下代码打印5而不是6?

来自分类Dev

为什么以下代码不会引发错误?

来自分类Dev

为什么以下代码会产生分段错误?

来自分类Dev

为什么clang ++不编译以下代码?

来自分类Dev

以下代码不起作用..为什么呢?

Related 相关文章

热门标签

归档