2012-12-15 5 views
5

のは、私はこのようなツリーを定義したいとしましょう:非難された-XDatatypeContextの代わりに?

{-# LANGUAGE DatatypeContexts #-} 
class Node a where 
    getContent :: (Num a) => a 

data (Node a) => Tree a = Leaf a 
         | Branch a (Tree a) (Tree a) 

-XDatatypeContextsが廃止されます。それなしで似たようなことをすることは可能ですか?

答えて

13

データ型のコンテキストが実際に行ったと思いますか?それはdeprecated because it was basically uselessであり、誤っているとみなされていました。なぜなら、それがなければ、あなたが持っていたタイプ以外のタイプについて何ら保証することなく、余分な制約を加えることを余儀なくされたからです。

交換などは、実際にはとなります。何かが役に立つのは、GADT syntaxです。あなたのタイプの同等は次のようになります。

data Tree a where 
    Leaf :: (Node a) => a -> Tree a 
    Branch :: (Node a) => a -> Tree a -> Tree a -> Tree a 

をこの場合、Tree値を作成する際には、Node制約が必要ですが、パターンTree値に一致するときは、自動保証を得ることNodeインスタンスTree aを引数として受け取った関数の型でもインスタンスを使用することなくインスタンスを利用できるようにします。

+0

ありがとうございます!あなたが意味すると思うが Branch ::(ノードa)=> a - >ツリーa - >ツリーa – Jake

+0

@Jake:いいえ - 関数型シグネチャと同じように機能するので、最後の 'Tree a'が結果データ・タイプ。 'a - > Tree a - > Tree a'は1つのサブツリーしか持たないでしょう。あなたが現在持っている 'Branch'コンストラクタのタイプを比較してください。 –

+0

ああ、そうだよ。 – Jake

関連する問題