haskell - 非法数据类型上下文

标签 haskell

我必须对 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/

相关文章:

Haskell DerivingVia 在多参数类型类上的乐趣 deps

haskell - Haskell 中的字数统计程序

haskell - Tree(Int,Int) 在 haskell 中是什么意思?

haskell - 将计算从 State monad 提升到 RWS monad

list - 等效代码,一个有效,另一个无效

animation - Haskell Gloss 没有动画

haskell - 为什么 GHC 打印 15 元组而不打印 16 元组?

haskell - 确定执行脚本的名称

haskell - 无法通过 cabal install 安装 Hake

haskell - 在 Haste 中,是否可以使用 RPC 从服务器调用客户端代码?