一緒に交差できる幾何オブジェクトの型クラスを定義したい:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
アイデアは、さまざまなタイプのオブジェクトを処理できる汎用の交差関数を持つことです。次のようなインスタンスを想像できます
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
しかし、交差点が可換であることも宣言したいと思います。
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
問題は、私は評価するたびにすることであるintersect x y
最初のフォームのインスタンス定義せずにIntersect a b c
、a
のタイプであるx
とb
の一種であるがy
、プログラムが無限ループに入り、おそらく可換性について再帰インスタンス宣言によって引き起こされます。理想的にintersect Egg Bacon
は、そのようなインスタンスが定義されておらず、無限ループに陥るのではなく、タイプチェックに失敗するようなものが必要です。これを実装するにはどうすればよいですか?
タイプファミリを使用して実行できることのように思えます。スタックオーバーフローでより良い応答が得られる場合があります。
—
ベンジャミンホジソン
ここでは可換性を強制モナドについてのブログ記事があり、多分それは助けることができる:gelisam.blogspot.ca/2013/07/the-commutative-monad.html
—
ダニエル・ディアスCarrete