在输入上得到解析错误' ='错误(haskell)

时间:2015-03-31 21:46:08

标签: haskell

我的函数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]

2 个答案:

答案 0 :(得分:4)

letlen需要n

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

但这并不会解决您的所有问题,一旦添加了let,它就不会进行类型检查,[[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定义,但希望它对如何解决这类问题更有启发性。

答案 1 :(得分:0)

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

因此,代码的语法正确版本为:

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