Haskell: печать TextEncoding - PullRequest
4 голосов
/ 24 июля 2010

Хаскель новичок здесь.

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.1

При попытке отладить странную ошибку, связанную с локалью, в сторонней программе на Haskell, я пытаюсь напечатать кодировку по умолчанию:

import System.IO
main = do
  print localeEncoding

Но это не удалось:

$ ghc -o printlocale main.hs
main.hs:4:2:
    No instance for (Show TextEncoding)
      arising from a use of `print' at main.hs:4:2-21
    Possible fix: add an instance declaration for (Show TextEncoding)
    In the expression: print localeEncoding
    In the expression: do { print localeEncoding }
    In the definition of `main': main = do { print localeEncoding }

Мой гугл-фу подводит меня. Чего мне не хватает?

1 Ответ

5 голосов
/ 25 июля 2010

Чтобы напечатать значение некоторого типа в Haskell, тип должен быть экземпляром класса Show.

localeEncoding :: TextEncoding

и TextEncoding не является экземпляром Show.

Тип TextEncoding на самом деле является экзистенциальным типом, хранящим методы кодирования и декодирования:

data TextEncoding
  = forall dstate estate . TextEncoding  {
    mkTextDecoder :: IO (TextDecoder dstate),
    mkTextEncoder :: IO (TextEncoder estate)
  }

Поскольку это функции, разумного способа их показать нет. Текущее localeEncoding определяется с помощью iconv, через функцию C nl_langinfo.

Таким образом, TextEncoding как таковой не является отображаемым типом, поэтому его нельзя распечатать. Однако вы можете создать новые значения этого типа через mkTextEncoding. Например. создать среду utf8:

mkTextEncoding "UTF-8" 

Мы могли бы рассмотреть запрос функции для сохранения представления локали с помощью TextEncoding, чтобы эта метка могла быть напечатана. Однако в настоящее время это невозможно.

...