2016-04-26 56 views
1

如何使類型顯示?使類型可顯示。

type InterpreterMonad = StateT (Env, Env) (ErrorT String IO)() 

通常情況下,我會鍵入deriving Show但我有一個typenewtypedata

P.S.如何用newtype寫上面?

+1

[類型同類對類型實例有什麼影響? GHC中的TypeSynonymInstances編譯指示是做什麼的?](http://stackoverflow.com/questions/2125674/what-is-the-effect-of-type-synonyms-on-instances-of-type-classes-what-does -the) – jberryman

+1

如果你看看'StateT',它基本上是一個函數,現在你有一個函數可以顯示的問題 - 比如'id :: a - > a' - 應該顯示什麼'show id'? – Carsten

回答

4

type創建一個類型的同義詞。如果要創建實例,則必須爲類型同義詞的目標創建它 - 在此例中爲StateT (Env, Env) (ErrorT String IO)()。但是,GHC無法爲StateT類型推導出Show實例,因爲StateT是函數類型的包裝,而GHC無法爲函數類型推導Show

newtype InterpreterMonad = MkInterpreterMonad (StateT (Env, Env) (ErrorT String IO)()) 

但這不會讓你得到Show,因爲相關InterpreterMonad現在大約是圍繞一個函數類型的包裝的包裝:

如下你可以寫一個NEWTYPE。