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]

あなたはこれをチェックすることができます。関数はどのリストのどのインデックスの要素も返すことができないため、「要素が見つかりません」を返すには多分を使用する必要があります

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

Here we go:

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