2010-04-21 124 views
2

完成noob到Haskell這裏可能是一個甚至noobier問題。我試圖讓ghci輸出工作,並堅持實例聲明。我怎麼能申報「(顯示(堆棧 - >棧))」的實例給出:創建Haskell實例聲明

data Cmd = LD Int 
     | ADD 
     | MULT 
     | DUP 
     deriving Show 

type Prog = [Cmd] 

type Stack = [Int] 

type D = Stack -> Stack 

我一直想創建一個聲明:

instance Show D where show = Stack 

但我所有的嘗試都導致非法實例聲明。任何幫助和/或引用非常感謝!

+1

從代碼中不清楚你想要什麼,例如'show(\ s - > 1:s)'返回。 – sepp2k 2010-04-21 21:43:18

+1

我有一個預感,你試圖爲D定義一個Show實例,不是因爲它真的是你想要的(很難想象它能做什麼),而是因爲編譯器告訴你你需要一個,因爲你有一個類型某處出錯;那可能嗎?如果是這樣,解決方案是解決你的其他代碼。 – 2010-04-23 07:25:05

回答

6

首先,默認情況下,在實例聲明中輸入同義詞(即使用type定義的東西)是不合法的。但是,有一個GHC擴展來允許這個。

除此之外,在這種特定情況下,show需要返回String;您的實例正試圖返回一個... type同義詞名稱,該名稱甚至沒有意義,除此之外還指Int的列表,這是show的錯誤返回類型。

最後,D是一個函數類型 - 無論如何,這應該是show?在大多數情況下,對於函數類型上的Show實例,實際上可以做的並不多。

如果你只是希望它說:「這是類型d」,你可以寫一個實例是這樣的:

{-# LANGUAGE TypeSynonymInstances #-} 
instance Show D where show _ = "Stack -> Stack" 

我不知道是多麼有用的是在實踐中,雖然。

+0

也許他想顯示從一個[Int]到另一個[Int]的變異? 不確定如何去截取這個,顯示參數,然後結果。 – Dan 2010-04-22 00:14:47