2011-08-25 11 views
8

"Ideal"のタイプを定義したいが、これはリストであるが構造はある。数値プレリュードは既にリストのために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 

はない、実際に、そのようなコンビネータのための最高のデザインは、私が疑うが、あなたのアイデアを得ます。