我正在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?这不是这种递归的重点吗?
答案 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)