我想定義一種類型的「理想」,它是一個列表,但有一些結構。數字前奏已經爲列表定義了Ring
的實例,但他們沒有使用我想要的加法和乘法的定義。所以我覺得在這種情況下我應該說Haskell newtype,但保留舊功能
newtype Ideal a = Ideal [a]
這工作得很好,但現在它給了我一個錯誤,如果我嘗試這樣做,說take 5 $ Ideal [0..]
。
有沒有一種方法可以保留我想要的功能,並且只覆蓋我明確覆蓋的定義?
我想定義一種類型的「理想」,它是一個列表,但有一些結構。數字前奏已經爲列表定義了Ring
的實例,但他們沒有使用我想要的加法和乘法的定義。所以我覺得在這種情況下我應該說Haskell newtype,但保留舊功能
newtype Ideal a = Ideal [a]
這工作得很好,但現在它給了我一個錯誤,如果我嘗試這樣做,說take 5 $ Ideal [0..]
。
有沒有一種方法可以保留我想要的功能,並且只覆蓋我明確覆蓋的定義?
對於普通功能,沒有。你必須提供你自己的定義。
然而,對於屬於一個類型的類的功能,你可以使用GeneralizedNewtypeDeriving
延伸到從基礎類型newtype
的暴露你想要的類型類。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype MyState a = MyState (State Int a)
deriving (Monad)
如果你不是太設置的事情都是完全自動的,你可以在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
實際上沒有這樣的組合子最好的設計,我懷疑,但你的想法。