顶层的裸体表达

时间:2018-03-08 20:16:29

标签: haskell

我一直试图在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

没有进口打字错误,而且我花了很长时间进行小调整而没有进展! 感谢

1 个答案:

答案 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