Haskell: печать TextEncoding

Новичок в Haskell здесь.

$ 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 }

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


person Alexander Gladysh    schedule 24.07.2010    source источник
comment
GHC 7.0 и более поздние версии имеют Show TextEncoding экземпляр.   -  person sdcvvc    schedule 28.08.2012


Ответы (1)


Чтобы напечатать значение некоторого типа в 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, чтобы эту метку можно было напечатать. Однако в настоящее время это невозможно.

person Don Stewart    schedule 24.07.2010
comment
Значит, у меня вообще нет возможности его распечатать? Как мне тогда отлаживать? - person Alexander Gladysh; 25.07.2010
comment
Что вы пытаетесь отладить? Печать типа данных TextEncoding ничего интересного вам не скажет. Вы пытаетесь узнать, где сейчас находитесь? - person Don Stewart; 25.07.2010
comment
Программа, которую я отлаживал, где-то в процессе работы теряет правильную локаль (она находится на Haskell и порождает другую программу, написанную на Haskell), и выдает исключение, что она пытается прочитать неправильный байт из ввода. - person Alexander Gladysh; 08.08.2010
comment
Я работал над этим, обновившись до новой версии программы, которая обрабатывает весь ввод как UTF-8. - person Alexander Gladysh; 08.08.2010