4

ハスケル初心者です。

$ ghc --バージョン
The Glorious Glasgow Haskell Compilation System、バージョン 6.12.1

サードパーティの Haskell プログラムで奇妙なロケール関連のバグをデバッグしようとしているときに、デフォルトのエンコーディングを出力しようとしています:

import System.IO
main = do
  print localeEncoding

しかし、それは失敗します:

$ ghc -o printlocale main.hs
main.hs:4:2:
    (Show TextEncoding) のインスタンスがありません
      main.hs:4:2-21 での「print」の使用に起因する
    可能な修正: (Show TextEncoding) のインスタンス宣言を追加します。
    式: print localeEncoding
    式: do { print localeEncoding }
    「main」の定義: main = do { print localeEncoding }

私のgoogle-fuは私を失敗させています。私は何が欠けていますか?

4

1 に答える 1

5

Haskell で何らかのタイプの値を表示するには、そのタイプが Show クラスのインスタンスである必要があります。

localeEncoding :: TextEncoding

TextEncoding は Show のインスタンスではありません。

TextEncoding 型は実際には、エンコードとデコードのメソッドを格納する存在型です。

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

これらは関数であるため、それらを表示する賢明な方法はありません。現在の localeEncoding は、C 関数 nl_langinfo を介して、iconv を使用して決定されます。

したがって、 TextEncoding 自体は表示可能なタイプではないため、印刷できません。ただし、mkTextEncoding を使用して、このタイプの新しい値を作成できます。たとえば、utf8 環境を作成するには:

mkTextEncoding "UTF-8" 

TextEncoding を使用してロケールの表現を保存する機能要求を検討する場合があるため、このラベルを印刷できます。ただし、現在それは不可能です。

于 2010-07-24T20:05:10.147 に答える