Почему `(show (list elem)) ++ '\ n'` не работает в Haskell? - PullRequest
0 голосов
/ 15 апреля 2020

Мой вопрос прост, и я новичок в haskell, так что это может быть простой вопрос. Следующая функция:

my_version_unlines list = [(show (list !! i)) ++ '\n' | i <- [0..(length list)-1]]

Когда я пытаюсь использовать его, я получаю это сообщение об ошибке:

Couldn't match expected type `[Char]' with actual type `Char'

Я также увидел, что show ([2]!!0) ++ '\n' выдает то же сообщение об ошибке в GHCi , Может ли кто-нибудь объяснить это?

1 Ответ

1 голос
/ 15 апреля 2020

'\n' - это Char. Функция (++) :: [a] -> [a] -> [a] добавляет два списка вместе. A Char это не список. Строка, однако, так как String это просто псевдоним для [Char], поэтому список Char s.

Таким образом, вы можете сделать это с помощью:

my_version_unlines list = [show li ++ <b>"\n"</b> | li <- list]

Здесь таким образом, двойные кавычки "&hellip;" указывают на строку, тогда как одинарные кавычки '&hellip;' используются для Char.

. В качестве альтернативы мы можем использовать map здесь:

my_version_unlines :: Show a => [a] -> [String]
my_version_unlines = <b>map</b> ((++ "\n") . show)

Однако если вы хотите преобразовать список объектов в String, разделенный строками, лучше использовать unlines :: [String] -> String:

my_version_unlines :: Show a => [a] -> String
my_version_unlines = <b>unlines</b> . map show

Примечание : Использование (!!) :: [a] -> Int -> a часто не очень хорошая идея. Список реализован в Haskell как связанный список, и, таким образом, это будет занимать линейное время, кроме того, функция равна non-total , поскольку для отрицательных индексов или индексов, превышающих длину списка, это будет ошибка. Часто лучше перебирать сам список.

...