弃用-XDatatypeContext的替代方案?

时间:2012-12-15 02:20:31

标签: haskell

假设我想要定义一个这样的树:

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

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

-XDatatypeContexts现已弃用。没有它可以做类似的事吗?

1 个答案:

答案 0 :(得分: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

在这种情况下,您在创建Node值时需要Tree约束,但是当Tree值上的模式匹配时,您还可以自动保证Node实例存在,使实例可用,甚至不需要在接收Tree a的函数类型中作为参数。