Почему функция length говорит, что эта 8-символьная строка имеет 9 символов?
>>> length "Níðhöggr"
9
Ответ 1
"Níðhöggr" содержит 9 символов Юникода:
U+004E N (Lu): LATIN CAPITAL LETTER N
U+00ED í (Ll): LATIN SMALL LETTER I WITH ACUTE
U+00F0 ð (Ll): LATIN SMALL LETTER ETH
U+0068 h (Ll): LATIN SMALL LETTER H
U+006F o (Ll): LATIN SMALL LETTER O
U+0308 ̈ (Mn): COMBINING DIAERESIS
U+0067 g (Ll): LATIN SMALL LETTER G
U+0067 g (Ll): LATIN SMALL LETTER G
U+0072 r (Ll): LATIN SMALL LETTER R
Возможно, вы захотите использовать "Níðhöggr" , который выглядит так же, когда распечатывается, но содержит U+00F6 LATIN SMALL LETTER O WITH DIAERESIS вместо двухзначного комбо. Другими словами, он находится в сформованной нормальной форме (NFC).
Или вы можете захотеть "Níðhöggr" , который имеет 10 символов Unicode (í разделен int i и комбинирующий акцент). Это будет разложена нормальная форма (NFD).
Google "Нормализация Юникода" для интересных и/или волосатых деталей. Используйте эту функцию, чтобы нормализовать данные Unicode в Haskell (спасибо, Адам Розенфилд!).
Ответ 2
Поскольку ваш ö не является единственным символом ö (U + 00F6 LATIN SMALL LETTER O WITH DIAERESIS); это U + 006F LATIN SMALL LETTER O plus U + 0308 КОМБИНИРОВАННАЯ ДИАВЕРСИЯ.