假设我想定义这样的树:
{-# 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
您还会自动保证Node
实例存在,从而使实例可用,甚至不需要在Tree a
作为参数接收的函数类型中使用它。