Haskell newbie here.
$ ghc --version The Glorious Glasgow Haskell Compilation System, version 6.12.1
While trying to debug weird locale-related bug in third-party Haskell program, I'm trying to print default encoding:
import System.IO
main = do
print localeEncoding
But it fails:
$ 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 }
My google-fu is failing me. What am I missing?
To print a value of some type in Haskell, the type must be an instance of the Show class.
and TextEncoding is not an instance of Show.
The TextEncoding type is actually an existential type storing the methods for encoding and decoding:
Since these are functions, there's no sensible way to show them. The current localeEncoding is determined using iconv, via the C function nl_langinfo.
So, TextEncoding as such is not a showable type, so you cannot print it. However, you can construct new values of this type, via mkTextEncoding. E.g. to create a utf8 environment:
We might consider a feature request to store the representation of the locale with the TextEncoding, so this label could be printed. However, that's currently not possible.