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
私の場合、{ - #LANGUAGE IncoherentInstances# - }も必要でしたが、これは私の質問に対する答えです。ありがとう! – Tener
こんにちは - 特定のインスタンスはどのように選択されますか?すなわち、特に別個のモジュールが存在する場合に、GHCは常に最も特定のインスタンスを使用することを決定するか? 1か2か月前にハスケル・カフェでこれについてのスレッドがありましたが、誰も答えを出してくれませんでした。 –
ドキュメントによると:「-XOverlappingInstancesフラグは、最も特定のものがあれば、複数のインスタンスが一致するようにGHCに指示します。最も特定の一致がなければ、プログラムは拒否されます。 –