1

根据这段代码,我在 Haskell 中做了一个二叉树数据类型:

data Tree a = EmptyTree
            | Node a 
            (Tree a) (Tree a) deriving (Show,Eq)

我还创建了一个在树中插入元素的函数:

treeinsert :: (Ord a) => a -> Tree a -> Tree a
treeinsert x EmptyTree = leaf x

treeinsert x (Node a left right)
         | x == a = Node x left right
         | x < a  = Node a (treeinsert x left) right
         | x > a = Node a left (treeinsert x right)

现在,为了进行测试,我使用了一个 Int 元素列表,如下所示:

    ghci> let nums = [8,6,4,1,7,3,5]  
    ghci> let numsTree = foldr treeInsert EmptyTree nums  
    ghci> numsTree  
Node 5 (Node 3 (Node 1 EmptyTree EmptyTree) (Node 4 EmptyTree EmptyTree)) (Node 7 (Node 6 EmptyTree EmptyTree) (Node 8 EmptyTree EmptyTree))

我的问题是当我检查 numsTree 的类型时:

:type numsTree
numsTree :: Tree Integer

为什么它不只是“树”的类型?

我有点困惑。(对不起我的语言)

4

2 回答 2

4

您将类型定义Tree为参数化类型。数据类型定义中的a后面Tree就是这个参数。这意味着不仅有一种Tree类型,而且还有许多不同的类型。例如,您可以有一个Tree Integer包含整数的类型、一个Tree Bool包含布尔值的类型和一个Tree (String -> String)包含从字符串到字符串的函数的类型。

请注意,您可以区分这些不同的类型是一件好事。这意味着当你从这样的树中得到一个值时,你知道你将得到哪种类型的值。如果只有一种Tree类型,那么您将无法找到。

于 2013-08-30T06:47:01.253 回答
1

为什么它不只是“树”的类型?

因为您明确地将数字列表传递给它,这限制了类型。

如果你定义nTree = foldr treeInsert(在 ghci prepend a 中let)你会得到预期的更通用的类型。顺便说一句,您可能希望添加Leaf a为另一个数据构造函数。

于 2013-08-30T07:16:04.330 回答