F#二叉树插入类型错误

时间:2017-05-11 20:28:08

标签: f# binary-tree

我正在F#中进行简单的BST实施,遇到了一个我无法找到解决办法的绊脚石。

此代码:

type BST =
| Empty
| TreeNode of int * BST * BST

let rec insert value tree = function
    | Empty -> TreeNode(value, Empty, Empty)
    | TreeNode(hd, left, right) as node ->
        if hd = value then node
        elif value < hd then TreeNode(hd, insert value left, right)
        else TreeNode(hd, left, insert value right)

导致以下错误:

error FS0001: This expression was expected to have
type
'BST'     

but here has type
'BST -> BST'

这是指这两行代码

elif value < hd then TreeNode(hd, insert value left, right)
else TreeNode(hd, left, insert value right)

特别是递归调用... insert value left, ...... insert value right)

我不太了解F#,无法理解为什么这对编译器来说是一个问题。当它执行时,该值不能解决为只键入BST?这不是这种递归的重点吗?

1 个答案:

答案 0 :(得分:3)

let f = function
| ...

相当于:

let f x =
    match x with
    | ...

所以你要定义insert来取3个参数而不是你想要的两个参数。您的insert类型为int -> 'a -> BST -> BST,因此您没有为递归调用提供足够的参数,因此错误。由于您希望匹配树的结构,请删除tree参数,即

let rec insert value = function
    | Empty -> TreeNode(value, Empty, Empty)
    | TreeNode(hd, left, right) as node ->
        if hd = value then node
        elif value < hd then TreeNode(hd, insert value left, right)
        else TreeNode(hd, left, insert value right)