我正在学习Haskell,我正在尝试将一些前提条件添加到(简单的,作为练习)element_at
函数(下面的代码)中。我创建了一个“帮助器”elem_at_r
,否则,len x
在某些时候失败(当x是'文字'而不是列表? - 我仍然无法解析ghci的错误消息)。 elem_at
现在已经完成了所有错误检查,elem_at_r
完成了工作。在elem_at
中,我想添加一个检查x
确实是一个列表(而不是'文字')。我怎么能这样做?
len x = sum [ 1 | a <- x]
elem_at_r x n | n == 0 = head x
| 0 < n = elem_at_r (tail x) (n-1)
elem_at x n | x == [] = error "Need non-empty list"
| len x <= n = error "n too large " ++ show (len x)
| n < 0 = error "Need positive n"
| otherwise = elem_at_r x n
谢谢!
谢
答案 0 :(得分:4)
由于Haskell的类型系统,elem_at
只能 将列表作为其第一个参数(x
);如果你试图传递一个非列表,GHC将检测到这一点,并在编译时(或GHCi中的解释时间)给出错误。我不知道为什么len
会“失败”;你能发布GHCi给你的错误信息吗?
答案 1 :(得分:1)
由于“x == []”行,您似乎遇到了错误。模式下面的代码匹配该条件并添加一些签名。否则它是一样的。希望它有所帮助。
len x = sum [ 1 | a <- x]
elem_at_r :: [a] -> Int -> a
elem_at_r x n | n == 0 = head x
| 0 < n = elem_at_r (tail x) (n-1)
elem_at :: [a] -> Int -> a
elem_at [] _ = error "Need non-empty list"
elem_at x n | len x <= n = error ("n too large " ++ show (len x))
| n < 0 = error "Need positive n"
| otherwise = elem_at_r x n
您还可以使用where子句将辅助函数作为此函数的一部分:
elem_at :: [a] -> Int -> a
elem_at [] _ = error "Need non-empty list"
elem_at x n | len x <= n = error ("n too large " ++ show (len x))
| n < 0 = error "Need positive n"
| otherwise = elem_at_r x n
where
len :: [a] -> Int
len x = sum [ 1 | a <- x]
elem_at_r :: [a] -> Int -> a
elem_at_r x n | n == 0 = head x
| 0 < n = elem_at_r (tail x) (n-1)