2016-11-26 3 views
2

以下に出力を示します。私は数値のリストを与え、それらが等しくなければFalseを返し、正しく働いています。しかし、数字のリストが等しいならば、それは真を返さない。このコードをチェックできますか?各数字のリストは等しくない偽ではあるが同じ数字では動作しない

la [] = True 
la a = 
     if ((head a)==head (tail a)) 
      then la (tail a) 
      else False 

出力:

Cw2016> la [1,2,2] 
False 
Cw2016> la [2,2,2] 

Program error: pattern match failure: head [] 

Cw2016> la [2,2,3] 
False 
Cw2016> la [0,1,3] 
False 
Cw2016> la [0,0,3] 
False 
Cw2016> la [0,0,0] 

Program error: pattern match failure: head [] 

Cw2016> 
+1

'la [1]'の評価を行います。 –

+1

'head(x:xs)= x'と' tail(x:xs)= xs'は 'la(x:xs)'と読みやすくなりました。 – wizzup

答えて

6

問題は、第二分岐で、あなただけのリストは、サイズ、少なくとも1を持っていることを知っていますが、第二引数を探しているということです。私はあなたがパターンマッチングで頭と尾を(部分的な機能である)を交換をお勧めします:

la [] = True 
la (x0:x1:xs) = 
     if (x0 == x1) 
      then la (x1:xs) 
      else False 

あなたは-WでGHCを呼び出した場合、あなたはあなたのパターンは、Xをカバーしていない警告を取得します:[] 。おそらく、このブランチを追加する:に

 if (x0 == x1) 
      then la (x1:xs) 
      else False 

la (x0:[]) = True 

通過では、あなたの式を簡素化する必要があり、もう少し技術的な問題について取得するには

(x0 == x1) && la (x1:xs) 

xの場合はa = [x]のときに問題が発生します。

head (tail a) 
= { value of a } 
    head (tail (x:[])) 
= { first equation of tail } 
    head [] 
= { second equation of head } 
    undefined 

そして、あなたがエラーを取得する理由です:すると、次のように表現head (tail a)が評価

head (x:xs) = x 
head [] = undefined 

tail (x:xs) = xs 
tail [] = undefined 

:まず、headtailは以下のように定義されています。

関連する問題