如何检查我正在处理Haskell中的列表?

时间:2011-05-18 17:18:36

标签: haskell types

我正在学习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  

谢谢!

2 个答案:

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