我认为@chepner已将其钉牢。这旨在成为一个既包含键(类型为a
)又包含值(类型为b
)的二叉树。
这样想。如果您从定义开始:
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
,并且想在每个节点上存储键/值对,可以将a
类型成对。以下不是合法的Haskell data
类型,因为您不能在左侧使用(k,v)
,但是它说明了有效类型Tree (k,v)
的样子:>
data Tree (k,v) = EmptyTree | Node (k,v) (Tree (k,v)) (Tree (k,v))
通过为类型构造函数k
设置v
和Tree
适当的参数,即用{{1}替换Tree (k,v)
,可以使之成为有效的Haskell类型定义。 }:
Tree k v
现在,作为一般规则,如果您的数据类型的构造函数包括一对:
data Tree k v = EmptyTree | Node (k,v) (Tree k v) (Tree k v)
或多或少等于:
data SomeType a b = Pair1 (a,b)
毕竟,您可以编写data SomeOtherType a b = Pair2 a b
或Pair1 (2,"hello")
,它们都存储相同的数据。
鉴于此,我们可以将Pair2 2 "hello"
的定义重写为:
Tree k v
现在,data Tree k v = EmptyTree | Node k v (Tree k v) (Tree k v)
构造函数中的四个字段没有按此顺序排列;我们可以重新排序它们并仍然存储完全相同的信息,因此让我们将“左分支”字段移到最前面:
Node
现在,这与您的data Tree k v = EmptyTree | Node (Tree k v) k v (Tree k v)
类型的结构完全匹配:
BT
本文链接:https://www.f2er.com/3152983.html