Это плохая идея использовать [Char] вместо String в объявлении типа функции Haskell

Я только начал изучать Haskell, используя "Learn the Haskell for Great Good". В настоящее время я читаю главу "Типы и классы типов", поэтому мои знания довольно.. отсутствуют. Я использую Sublime Text 2 с пакетом SublimeHaskell, который создает / проверяет файл при каждом сохранении.

Проблема: я пытаюсь сделать объявление типа функции следующим образом:

funcName :: [Char] -> [Char]

Я получаю это предупреждение:

Внимание: используйте найденную строку: [Char] -> [Char] Почему бы и нет: String -> String

Сборка не удалась

Можете ли вы объяснить мне, почему это плохая идея использовать массив Char вместо String, или дать мне ссылку на объяснение возможных последствий и т. Д. Я погуглил и ничего не нашел.

PS Я разработчик C#, я понимаю разницу между массивом char и строками в c-подобных языках.

3 ответа

Решение

Где-то в базовой библиотеке вы найдете это определение:

type String = [Char]

что говорит о том, что String а также [Char] это точно то же самое. Какой из этих двух вариантов вы выберете - документация. Я часто определяю псевдонимы типа так:

type Domain = ByteString
type UserName = Text

Рекомендуется использовать типы для документации.

Также как важное примечание, [Char] это не тип для символьных массивов, а списки символов. Поскольку существуют также реальные типы массивов, различие важно!

String это не более чем псевдоним типа для [Char]Таким образом, между ними нет никакой практичности - это просто вопрос читабельности.

Похоже, вы автоматически запускаете HLint для своего кода и рассматриваете любые предупреждения HLint как фатальные ошибки. Как говорит автор HLint: "Не слепо применяйте вывод HLint". String а также [Char] точно так же, как все говорят, это вопрос, который выглядит лучше. Я хотел бы использовать String если я работаю со смежными списками символов, я хочу рассматривать их как блок (большую часть времени) и явно использовать [Char] когда персонажи не имеют смысла объединены в беге (гораздо реже). HLint делит все подсказки на ошибки (исправить) и предупреждения (думать), поэтому, возможно, лучше всего строить ошибки только на подсказках ошибок.

Другие вопросы по тегам