【问题标题】:Binary Search Tree Haskell二叉搜索树 Haskell
【发布时间】:2015-02-13 04:57:18
【问题描述】:

我在 Haskel 中有一个二叉搜索树的插入函数。我的插入函数前两行如下所示

insert :: (Ord a) => BST a -> a -> BST a
insert Nil x = Node x Nil Nil

我知道该功能有效,我已经在单个数字上对其进行了测试。但现在我正在尝试将插入应用到列表中。我试过这段代码

let mBST = foldr insert Nil [1,2,7,9,3,5]

我收到以下错误

Occurs check: cannot construct the infinite type: a0 = BST a0
Expected type: BST (BST a0) -> BST a0 -> BST a0
Actual type: BST (BST a0) -> BST a0 -> BST (BST a0)
In the first argument of `foldr', namely `insert'
In the expression: foldr insert Nil [1, 2, 7, 9, ....]

我在 BST a -> a -> BST a 中有一个错误,但我不知道如何修复它。

【问题讨论】:

    标签: haskell functional-programming binary-search-tree


    【解决方案1】:

    foldr 具有(a -> b -> b) -> b -> [a] -> b 类型,这意味着它需要a -> b -> b 类型的函数作为其第一个参数。在您的特定示例中,它转换为 Integer -> BST Integer -> BST Integer,这与插入的类型不同。

    最简单的解决方案是翻转插入功能:

    let mBST = foldr (flip insert) ...
    

    【讨论】:

      【解决方案2】:

      这样做的原因是foldr f init lst 传递了f 列表中的一个元素,结果是按此顺序折叠列表的其余部分。你可以写

      insert :: (Ord a) => a -> BST a -> BST a
      insert x Nil = Node x Nil Nil
      

      (这会更惯用)或写foldr (flip insert) Nil

      您可能很快就会了解到,在这种情况下,使用严格的左折叠而不是右折叠会更有效。使用您的实现,这是foldl' insert Nil。使用我的(更惯用的)一个,这是foldl' (flip insert) Nil

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        • 2013-06-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多