我一直试图在ghci上解决这个解析错误一段时间,我似乎无法在网上找到一个不模糊的答案:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) - if z == c && y == b then True else False
Parse error: naked expression at top level
Perhaps you intended to use TemplateHaskell
没有进口打字错误,而且我花了很长时间进行小调整而没有进展! 感谢
答案 0 :(得分:4)
错误意味着在顶层,您通常只定义函数(以及数据类型,类型类,类型实例等,但现在让我们忽略它。)
现在你写:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) - if z == c && y == b then True else False
-- ^
但是正如你所看到的,你没有定义一个函数:确实没有相等的符号(=
)。所以Haskell解释这个就像你想从函数的头部减去函数体。
我们可以通过以下方式解决错误:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) = if z == c && y == b then True else False
-- ^
但现在仍有问题:如果两个列表中的一个包含少于三个元素,则该函数将出错。因此,我们最好为此类案例添加规则:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) = if z == c && y == b then True else False
enrollment _ _ = False
此外,编写if <expr> then True else False
是<expr>
的一个非常详细的版本,因此我们可以将其重写为:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) = z == c && y == b
enrollment _ _ = False
或者我们可以像@JonPurdy所说的那样构建两个元组并比较它们,例如:
enrollment :: Eq a => [a] -> [a] -> Bool
enrollment (x:y:z:xs) (a:b:c:as) = (y, z) == (b, c)
enrollment _ _ = False