首页 > 解决方案 > 一个 Haskell 写错误的问题 Found hole _ a5

问题描述

创建一个计算二叉树中下一个元素的函数。

data BSearchTree a = Nil | Node a (BSearchTree a) (BSearchTree a)
                      deriving (Show, Eq)
successor :: (Ord a) => a -> BSearchTree a -> Maybe a 
successor a = if a Nil then Just succ Nil
              else if a (Node _ t1 t2)
               then Just succ a (Node _ t1 t2)
           else Nothing

找到的洞:_ :: a5 其中:'a5'是一个模糊类型变量 • 在'Node'的第一个参数中,即'_' 在'a'的第一个参数中,即'(Node _ t1 t2)'中表达式:a (Node _ t1 t2) • 相关绑定包括 a :: a (绑定在桌面/Aufgabe6.4.hs:32:11) 后继 :: a -> BSearchTree a -> Maybe a (绑定在桌面/ Aufgabe6.4.hs:32:1) 约束包括 Ord a (from desktop/Aufgabe6.4.hs:30:1-53) | | else if a (Node _ t1 t2)

不太明白,错误是什么意思...

标签: haskellbinary-treebinary-search-tree

解决方案


if a (Node _ t1 t2)

这不是有效的 Haskell。您似乎将其if视为模式匹配的地方,而实际上它需要一个布尔表达式。

if a Nil then

这似乎遵循相同的逻辑。

而是考虑通过 case 表达式或函数定义进行模式匹配:

successor :: (Ord a) => a -> BSearchTree a -> Maybe a 
successor _NotUsingThisValue Nil = ... something ...
successor valToMatch (Node val leftTree rightTree) = .. other thing ..

NBJust succ Nil也无效。首先,它解析为(Just succ) Nil(not Just (succ Nil)),其次,这里没有有意义的使用succ


推荐阅读