Это плохая идея использовать [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 делит все подсказки на ошибки (исправить) и предупреждения (думать), поэтому, возможно, лучше всего строить ошибки только на подсказках ошибок.