假设我想要定义一个这样的树:
{-# LANGUAGE DatatypeContexts #-}
class Node a where
getContent :: (Num a) => a
data (Node a) => Tree a = Leaf a
| Branch a (Tree a) (Tree a)
-XDatatypeContexts现已弃用。没有它可以做类似的事吗?
答案 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
的函数类型中作为参数。