2017-02-17 2 views
0

私はハスケルにとって非常に新しく、takeに似た関数を書こうとしました、つまり、指定された数の項目を指定されたリストから返します。私のコードは次のとおりです。リテラル '0'から生じる(Eq i)を推論できません

take' :: (Num i, Ord a) => i -> [a] -> [a] 
take' 0 _ = [] 
take' _ [] = [] 
take' n (x:xs) = x : take' (n - 1) xs 

しかし、私はそれをコンパイルしようとすると、私は、次のエラーが表示さ:Haskellは0を認識することはできないとして、私は、エラーが発生していると思い

Could not deduce (Eq i) arising from the literal ‘0’ 
from the context (Num i, Ord a) 
    bound by the type signature for 
      take' :: (Num i, Ord a) => i -> [a] -> [a] 
    at recursion.hs:1:10-42 
Possible fix: 
    add (Eq i) to the context of 
    the type signature for take' :: (Num i, Ord a) => i -> [a] -> [a] 
In the pattern: 0 
In an equation for ‘take'’: take' 0 _ = [] 

をクラス型のNumのメンバーとして、しかし私は確信していません。誰もが私にエラーを説明し、それを修正する方法を教えてもらえますか?

+0

あなたは 'take '::(Num a、Eq a)=> a - > [a] - > [a]'が必要です。 – Alec

+1

@Alec:彼は 'take 'を望んでいると思う:(Num a、Eq a)=> a - > [b] - > [b]' :) –

+1

'i'に' Eq'制約を加える必要があります: '(Num i、Eq i、Ord a)=> i - > [a] - > [a]' a'の 'Ord'制約がどういうものかはっきりしません。 – Lee

答えて

7

パターン照合と同等の文字数に対してパターンが一致します。だから、

take' 0 _ = [] 

take' x _ | x == 0 = [] 

xが句のどこにも言及されていない変数になるように選択される)になります。したがって、このパターンをサポートするには、Numになるだけでなく、(==)をサポートするために必要なものがたくさん必要です!

Could not deduce (Eq i) arising from the literal ‘0’ 
In the pattern: 0 
In an equation for ‘take'’: take' 0 _ = [] 

あなただけのGHCはエラーで提案するという修正を取ることができます:

Possible fix: 
    add (Eq i) to the context of 
    the type signature for take' :: (Num i, Ord a) => i -> [a] -> [a] 

このように:それは、エラーのこの部分は、言っていることだ

take' :: (Eq i, Num i, Ord a) => i -> [a] -> [a] 

その後、あなたが考えることができますOrd aの制約がまったく必要かどうか。 =)

関連する問題