猿问

“字符串”应用于太多类型参数

我只是在学习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


慕森王
浏览 444回答 3
3回答

森栏

String 是类型,而不是类型类,因此您(必须)可以在类型签名中按原样使用它。cutString :: Num n => n -> String -> String

慕桂英546537

作为参考,较旧的GHC(即7.2.2或更早版本)曾给出此更有用的错误:Type constructor `String' used as a classIn the type `(Num n, String str) => n -> str -> str'确实,这正是您的问题:String是类型,并且您将其用作类型类。类型类是类型的集合,而不是单个类型,例如Integer和Double和Rational都是属于类型类的所有类型Num。类型类显示=>在类型的左侧,其中实型和类型变量显示在的右侧=>。

天涯尽头无女友

该函数当然具有更简单的类型cutString :: Num n => n -> [a] -> [a]。而且,Num在这种情况下没有太大意义,所以也许类型Integral i => i -> [a] -> [a]甚至Int -> [a] -> [a]更好。 – dflemstr 12年  8月18日,13:39@dflemstr我敢肯定你的
随时随地看视频慕课网APP
我要回答