0

我正在尝试编写一个检索列表中第 n 个元素的函数。

这是我到目前为止所拥有的:

main :: IO ()
main = do print (nth 3 [1,2,10])

nth _ [] = [] 
nth a (x:xs) 
 | (a == 1) = x 
 | otherwise = nth (a-1) xs

这是我得到的错误:

Error occurred
ERROR line 2 - Cannot justify constraints in explicitly typed binding
*** Expression    : main
*** Type          : IO ()
*** Given context : ()
*** Constraints   : (Show a, Num [a])
4

3 回答 3

5

为什么要Num [a]约束?因为在[]子句中你的函数返回一个列表,[]而在另一个子句中你让它返回一个列表的元素,x。这意味着它仅针对其元素是列表本身的列表定义。但是你用一个列表来调用它[1,2,10]。所以 Haskell 看到一个数字字面1量,想把它解释为一个同样是数字的列表。它还需要它是Showfor的一个实例print才能显示它:

Prelude> :i print
print :: (Show a) => a -> IO ()         -- Defined in System.IO
于 2012-12-15T18:19:56.060 回答
2

您正在返回子句中的列表

nth _ [] = []

和子句中的列表元素

nth a (x:xs) 
  | (a == 1) = x 
  | otherwise = nth (a-1) xs

所以你的函数类型是

*Main> :t nth
nth :: (Eq a1, Num a1) => a1 -> [[a]] -> [a]

你可以看看这个。您的函数无法返回任何列表的任何索引的元素,因此您必须使用 Maybe 返回“未找到元素”

nth _ [] = Nothing
nth a (x:xs) 
 | (a == 1) = Just x 
 | otherwise = nth (a-1) xs


*Main> :t nth
nth :: (Eq a1, Num a1) => a1 -> [a] -> Maybe a
于 2012-12-15T18:40:52.430 回答
0

开始了:

nth a (x:xs) 
| (a == 1) = x 
| otherwise = nth (a-1) xs
于 2012-12-15T18:26:18.890 回答