次のようなツリーを定義したいとしましょう。
{-# LANGUAGE DatatypeContexts #-}
class Node a where
getContent :: (Num a) => a
data (Node a) => Tree a = Leaf a
| Branch a (Tree a) (Tree a)
-XDatatypeContexts は非推奨になりました。それなしで似たようなことをすることは可能ですか?
次のようなツリーを定義したいとしましょう。
{-# LANGUAGE DatatypeContexts #-}
class Node a where
getContent :: (Num a) => a
data (Node a) => Tree a = Leaf a
| Branch a (Tree a) (Tree a)
-XDatatypeContexts は非推奨になりました。それなしで似たようなことをすることは可能ですか?
データ型コンテキストが実際にあなたが思っていたことをしたと確信していますか? 基本的に役に立たず、誤機能と広く見なされていたため、廃止されました。これは、それがなければ得られた以上の型に関する保証を提供せずに、追加の制約を追加することを強制するだけだったためです。
実際に何か有用なことを行う置換は、GADT構文です。あなたのタイプに相当するものは次のようになります:
data Tree a where
Leaf :: (Node a) => a -> Tree a
Branch :: (Node a) => a -> Tree a -> Tree a -> Tree a
この場合、値Nodeを作成するときに制約が必要ですが、Tree値のパターン マッチングを行うと、インスタンスが存在するTreeという自動保証も得られ、引数として受け取る関数の型でインスタンスを必要とせずにインスタンスを使用できるようになります。NodeTree a