2011-04-09 9 views
3

可能であれば、他の型にキャストできる型の型クラスを用意したいと思います。 特定の型の特殊型クラスの作成方法、他の型の既定の実装方法

class Castable a b where 
    cast :: a -> Maybe b 
    cast _ = Nothing -- default implementation 

は今のクラスは、いくつかのタイプのために実装されるだろうと すべて他人のために私は、デフォルトの実装を持っていると思います。

どうすればいいですか?

答えて

6

OverlappingInstances

まず使用して、それが必ずしも安全やHaskellの-yの事はやっていないが、それは確かに可能であり、それらを有効にします。

class Castable a b where 
    cast :: a -> Maybe b 
    cast _ = Nothing -- default implementation 

{-# LANGUAGE MultiParamTypeClasses #-} 
{-# LANGUAGE FlexibleInstances  #-} 
{-# LANGUAGE OverlappingInstances #-} 

ことはあなたの鋳造クラスを書きます

「最適化された」インスタンス:

instance Castable Int Bool where 
     cast 0 = Just False 
     cast _ = Just True 

、最終的には、すべてのタイプのための一般的な例:

instance Castable a b where 

使用例:

main = do 
    print $ (cast (7 :: Int) :: Maybe Bool) 
    print $ (cast (7 :: Int) :: Maybe Integer) 

はこれを実行すると、タイプは特殊なされていない場合、デフォルトが選択されます。

*Main> main 
Just True 
Nothing 
+0

私の場合、{ - #LANGUAGE IncoherentInstances# - }も必要でしたが、これは私の質問に対する答えです。ありがとう! – Tener

+0

こんにちは - 特定のインスタンスはどのように選択されますか?すなわち、特に別個のモジュールが存在する場合に、GHCは常に最も特定のインスタンスを使用することを決定するか? 1か2か月前にハスケル・カフェでこれについてのスレッドがありましたが、誰も答えを出してくれませんでした。 –

+1

ドキュメントによると:「-XOverlappingInstancesフラグは、最も特定のものがあれば、複数のインスタンスが一致するようにGHCに指示します。最も特定の一致がなければ、プログラムは拒否されます。 –

関連する問題