2011-08-25 40 views
8

我想定義一種類型的「理想」,它是一個列表,但有一些結構。數字前奏已經爲列表定義了Ring的實例,但他們沒有使用我想要的加法和乘法的定義。所以我覺得在這種情況下我應該說Haskell newtype,但保留舊功能

newtype Ideal a = Ideal [a] 

這工作得很好,但現在它給了我一個錯誤,如果我嘗試這樣做,說take 5 $ Ideal [0..]

有沒有一種方法可以保留我想要的功能,並且只覆蓋我明確覆蓋的定義?

回答

6

對於普通功能,沒有。你必須提供你自己的定義。

然而,對於屬於一個類型的類的功能,你可以使用GeneralizedNewtypeDeriving延伸到從基礎類型newtype的暴露你想要的類型類。

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
newtype MyState a = MyState (State Int a) 
    deriving (Monad) 
11

如果你不是太設置的事情都是完全自動的,你可以在the newtype package使用的實用功能,例如像over Ideal $ take 5

編輯:另外,順便說一句,這不是太難以從newtype包擴展函數來處理其他案件。例如,我有這些定義躺在身邊:

infixl 3 ./ 
(./) :: (Newtype n o) => (o -> t) -> (n -> t) 
(./) fx = fx . unpack 

liftN f x = pack $ f ./ x 
liftN2 f x y = pack $ f ./ x ./ y 
liftN3 f x y z = pack $ f ./ x ./ y ./ z 

實際上沒有這樣的組合子最好的設計,我懷疑,但你的想法。