2012-05-11 86 views
5

我目前正在嘗試爲原始算術功能編寫一個小的Show實例。功能的實例顯示

目標是列出可顯示的功能。

的節目很簡單的功能看起來像這樣:

showOp :: (Int -> Int -> Int) -> String 
    showOp op 
    | op 3 3 == 6 = "plus" 
    | op 3 3 == 0 = "minus" 
    | op 3 3 == 9 = "times" 
    | op 3 3 == 1 = "divide" 
    | otherwise = "undefined" 

但我不能得到顯示(INT - >內部 - >智力)的一個實例。我試過這樣:

instance Show (Int -> Int -> Int) where 
    show op = show "asdf" 

但它不起作用。 WinHugs只是返回錯誤

Syntax error in instance head (variable expected) 

它甚至可以定義顯示功能?如果是這樣,我怎麼解決這個問題?

回答

6

請勿使用WinHugs。使用GHC。

事實上,在最近的Haskell Platform版本中,已經有一個Show的函數實例。現在

Prelude Text.Show.Functions> show (+1) 
"<function>" 
Prelude Text.Show.Functions> show (\x -> x ++ "foo") 
"<function>" 

,你的情況,但是,你需要-XFlexibleInstances,因爲您的實例的形式(Constructor a1 .. an)不是其中a1 ..一個是不同類型的變量。

打開它與{-# LANGUAGE FlexibleInstances #-}

+0

這就是說,不可能定義'Show'來實際給你更多關於函數的細節。 –

+1

當然可以。它可以顯示類型(通過Typeable給出);或者它可以顯示一些輸入和輸出(如在QuickCheck中完成的那樣)。 –

+0

...是的。好的。抱歉。但是,它不能顯示實現或名稱。 –

3

(這不是一個答案(唐的介紹),但它實在太長了評論)

的代碼有很多重複的邏輯(特別是op 3 3 ==發生了很多),但有一個讓這個更清潔:case expressions。這允許我們計算op 3 3一次,然後處理各種情況(與函數定義中的模式匹配完全相同)。

showOp op = case op 3 3 of 
       6 -> "plus" 
       0 -> "minus" 
       9 -> "times" 
       1 -> "divide" 
       _ -> "undefined" 
1

您還可以使用擁抱。

開始擁抱hugs -98 +orunhugs -X-98 +o並在源文件中使用{-# LANGUAGE FlexibleInstances #-}