我必须对 BST 进行一些练习,并且我需要对树使用此实现:
data ( Ord a , Show a , Read a ) => BST a = Void | Node {
val :: a ,
left , right :: BST a
}
deriving ( Eq , Ord , Read , Show )
但是编译器给了我:
Illegal datatype context (use DatatypeContexts): (Ord a,
Show a,
Read a) =>
有人可以帮助我吗?
最佳答案
数据类型上下文通常被认为是无用的,因此在某些时候从标准 Haskell 中删除了。 (自 2010 年以来,就没有正式的标准文档仍然包含它们,但事实上的标准 GHC 现在默认不再允许它们。)
这些上下文并没有真正完成任何事情,除了强制任何提到 BST a
的人也要求 Ord a、Show a、Read a
- 但这些约束不能实际上可以在其他地方使用。因此,您可以使用受限版本完成的所有操作也可以使用更简单的版本完成
data BST a = Void
| Node { val :: a, left, right :: BST a }
deriving (Eq, Ord, Read, Show)
请注意,派生的例如Ord
实例会自动将 Ord a
添加到其上下文中,但也不需要 Read a
。
您为此数据类型定义的任何函数也可能需要施加一些约束,但它只需要实现实际需要的约束,而不是不加区别地全部。
关于haskell - 非法数据类型上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69556859/