5

假设我想定义这样的树:

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

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

-XDatatypeContexts 现在已弃用。没有它是否可以做类似的事情?

4

1 回答 1

13

确定数据类型上下文确实做了你认为的事情吗?它被弃用了,因为它基本上是无用的,并且被广泛认为是一个错误功能,因为它所做的只是强迫你添加额外的约束,而不提供任何关于类型的保证,而不是你没有它所拥有的类型。

替换,例如,实际上一些有用的事情,是GADT 语法。您的类型的等效项如下所示:

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作为参数接收的函数类型中使用它。

于 2012-12-15T02:34:02.243 回答