我的函数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]
答案 0 :(得分:4)
let
和len
需要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]
-- ^^^ ^^^