2012-12-15 28 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 ::(Node a)=> a - > Tree a - > Tree a – Jake

+0

@Jake:No - 它就像函数类型签名一样工作,所以最后一个'Tree a'是结果数据类型。 'a - >树a - >树a'只有一个子树。比较你当前拥有的'Branch'构造函数的类型。 –

+0

哦,对,我明白了。 – Jake

相关问题