`String'适用于太多类型的参数

Hus*_*r14 40 haskell

我只是在学习Haskell而我正在尝试编写一个简单的程序来消除a中的前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)
Run Code Online (Sandbox Code Playgroud)

虽然GHC给了我这个错误,我无法弄清楚原因:

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

Dan*_*ner 53

String 是一个类型,而不是类型类,所以你可以(必须)只在类型签名中使用它.

cutString :: Num n => n -> String -> String
Run Code Online (Sandbox Code Playgroud)

  • 这个函数当然有更简单的类型`cutString :: Num n => n - > [a] - > [a]`.另外,`Num`在这种情况下没有多大意义,所以也许类型`Integral i => i - > [a] - > [a]`甚至`Int - > [a] - > [a] `会更好. (8认同)

Ben*_*ood 33

作为参考,旧的GHC(即7.2.2或更早版本)用于提供这个更有用的错误:

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

确实这正是你的问题:String是一种类型,你将它用作类型类.类型类是类型的集合,而不是单个类型,例如Integer,Double并且Rational属于类型类的所有类型Num.类型类显示=>在类型的左侧,其中实数类型和类型变量显示在右侧=>.