【问题标题】:getting parse error on input '=' error (haskell)输入“=”错误(haskell)时出现解析错误
【发布时间】:2015-06-05 09:54:28
【问题描述】:

我的函数 append 接受列表 [[a], [b,c], [d,e]] 的列表并返回单个列表 [a,b,c,d,e]。 我把它写在一个文件中,所以我不必使用“let”,但我仍然在输入'='时遇到解析错误。谁能帮忙? 谢谢

append :: [[a]] -> [a]
append [[a]] = [ a | len = length a, n = 1, head a ++ (a !! n) , n < len]

【问题讨论】:

    标签: haskell


    【解决方案1】:

    无论代码是否在文件中,您仍然需要使用let 在列表推导式中定义局部变量。文件中的代码仅对顶级定义产生影响。本地定义保持不变。

    因此,您的代码的语法正确版本应该是:

    append :: [[a]] -> [a]
    append [[a]] = [ a | let len = length a, let n = 1, head a ++ (a !! n) , n < len]
    --                   ^^^                 ^^^
    

    【讨论】:

      【解决方案2】:

      len 和 n 需要 let:

      append [[a]] = [a | let len = length a, let n = 1, head a ++ (a !! n), n < len]
      

      但这并不能解决你所有的问题,一旦添加了lets,它就不会进行类型检查,而且[[a]] 可能不是你想在这里使用的模式。模式[[a]] 只会匹配[[1]] 之类的列表,不会匹配[]、[[1, 2]] 或[[1], [2]]。

      您还有另一个问题,head a ++ (a !! n) 应该是一个返回 Bool 的表达式,但在这种情况下它返回一个列表。列表推导中 | 右侧的任何“裸”表达式必须计算为 Bool 值。

      如果您想要展平列表列表,我建议您查看内置的concat 函数,该函数实际上是使用foldr 定义的。不过,折叠可能很难学习,所以我将展示一个使用显式递归的替代定义:

      myconcat :: [[a]] -> [a]
      myconcat [] = []
      myconcat (x:xs) = x ++ myconcat xs
      

      这相当于foldr 的定义,但希望它对如何解决这类问题更有指导意义。

      【讨论】:

        猜你喜欢
        • 2018-05-02
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 2014-08-12
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多