Ответ 1
String
- это тип, а не тип, поэтому вы можете (должны) просто использовать его как есть в сигнатуре типа.
cutString :: Num n => n -> String -> String
Я просто изучаю 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
String
- это тип, а не тип, поэтому вы можете (должны) просто использовать его как есть в сигнатуре типа.
cutString :: Num n => n -> String -> String
Для справки, более старые GHC (т.е. 7.2.2 или ранее), используемые для получения этой более полезной ошибки:
Type constructor `String' used as a class
In the type `(Num n, String str) => n -> str -> str'
В самом деле, это именно ваша проблема: String
- это тип, и вы используете его как класс типа. Класс типа представляет собой набор типов, а не один тип, например. Integer
и Double
и Rational
- все типы, принадлежащие классу классов Num
. Классы типов отображаются слева от =>
в типах, где реальные типы и переменные типа отображаются справа от =>
.