2016-05-03 4 views
1

再帰を使用してリストの長さを調べるコードを実行していますが、多くのエラーがあります。私は非常に初心者であり、私はうまくハスケルできません。ここ はコードです:リストの長さを調べるためにコードを改善するにはどうすればよいですか?

longListe :: [a] -> a 

longListe [] = error "Empty liste" 
longListe [x]= 1 
longListe n = 1 + longListe (n-1) 
main = print $ longListe 

とエラー:

No instance for (Num a) arising from the literal ‘1’ 
    Possible fix: 
     add (Num a) to the context of 
     the type signature for longListe :: [a] -> a 
    In the expression: 1 
    In an equation for ‘longListe’: longListe [x] = 1 

4-1-a.hs:6:31: 
    No instance for (Num [a]) arising from a use of ‘-’ 
    In the first argument of ‘longListe’, namely ‘(n - 1)’ 
    In the second argument of ‘(+)’, namely ‘longListe (n - 1)’ 
    In the expression: 1 + longListe (n - 1) 

4-1-a.hs:7:8: 
    No instance for (Show ([a0] -> a0)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from a use of ‘print’ 
    In the expression: print 
    In the expression: print $ longListe 
    In an equation for ‘main’: main = print $ longListe 

誰かが私を助けてくださいすることができます。ありがとう

+0

1つの問題:あなたは '(n-1)'を実行していますが、 'n'はリストです。リストに対して整数演算を実行することはできません。 – dvaergiller

+1

なぜ 'longListe'は空のリストに0を返すのではなく、エラーを発生させるのですか? – chepner

答えて

5

問題はあなたの関数の型定義にあります:longListe :: [a] -> a

数値のリストにlongListeを呼び出すと正常に動作します。たとえば、longListe [1,2,3]と入力すると、入力は[Int] -> Intになります。

ただし、文字列のリストの長さを取得しようとすると、このタイプは[String] -> Stringになります。これはではなく、数字を返すことができるので、あなたが望むものはです。

あなたがいることを示す取得エラー:リテラルから生じる(ヌムa)のために

ないインスタンスを「1」

あなたは数を返し、あなたの入力した数値演算を行うので、コンパイラはaが数字であることを予期しており、したがって、エラーは(Num a)と言います。

定義をlongListe :: [a] -> Intに変更すると、よりうまくいくはずです(実際はまだ動作しませんが、別の理由でこれを解決するようにします) 。

また、0を返す代わりに空のリストがエラーになる理由はありますか?

+0

Hmmmこのエラーが発生しました – posh

+0

4-1-a.hs:3:16: 予想されるタイプ 'Int'と実際のタイプ '[Char]'を一致させることができません "Empty liste" (show([a0] - > Int))のインスタンスがありません (多分あなたは持っていないかもしれません) )print: print: 式内:print $ longListe 'main'の式では、main = print $ longListe 失敗しました。モジュールが読み込まれませんでした。 : なし。 – posh

+1

@posh 'longListe [] = error" Empty liste "で' error'を削除したと仮定します。戻り値の型が不一致になりました。時には数値を返すこともあります( '[Char]'は 'String'と等価です)。返す値が常に同じ型であることを確認する必要があります。 –

関連する問題