41

私はHaskellを学んでいて、最初のn文字をから削除する簡単なプログラムを書こうとしていましたString。これは私が得たものです:

cutString :: (Num n, String str) => n -> str -> str

cutString n str = case n of
        0 -> tail str
        n -> cutString (n-1) (tail str)

GHCは私にこのエラーを与えます、そして私は理由を理解することができません:

`String' is applied to too many type arguments
 In the type signature for `cutString':
 cutString :: (Num n, String str) => n -> str -> str
4

2 に答える 2

54

Stringは型であり、型クラスではないため、型シグネチャでそのまま使用できます(必須)。

cutString :: Num n => n -> String -> String
于 2012-08-18T13:30:11.200 に答える
33

参考までに、古い GHC (つまり 7.2.2 以前) では、より役立つエラーが表示されていました。

Type constructor `String' used as a class
In the type `(Num n, String str) => n -> str -> str'

実際、それはまさにあなたの問題です:Stringは型であり、それを型クラスとして使用しています。型クラスは、単一の型ではなく、型の集合です。たとえばIntegerDoubleおよびRationalは、すべて型クラスに属する型Numです。型クラスは=>in 型の左側に表示され、実際の型と型変数は の右側に表示されます=>

于 2012-08-18T22:11:13.710 に答える