Подтвердить что ты не робот

`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
4b9b3361

Ответ 1

String - это тип, а не тип, поэтому вы можете (должны) просто использовать его как есть в сигнатуре типа.

cutString :: Num n => n -> String -> String

Ответ 2

Для справки, более старые 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. Классы типов отображаются слева от => в типах, где реальные типы и переменные типа отображаются справа от =>.