我可以使用 where 子句中定义的函数进行模式匹配吗?

Can I pattern match with a function defined in a where clause?

我的目标是定义一个函数“proper”,它接受一个“Tree a”数据类型:

data Tree a = One a | Two (Tree a) (Tree a)

并使用递归定义生成所有适当的子树(即除自身之外的所有子树)。

我当前的代码如下所示:

proper :: Tree a -> [Tree a]
proper (One a) = []
proper (Two t1 t2) = [t1,t2] ++ proper' t1 ++ proper' t2
proper' (One a) = [One a]
proper' (Two t1 t2) = [t1,t2] ++ proper' t1 ++ proper' t2

我想知道是否有任何方法可以在 where 子句中获取 proper'。我曾尝试使用标准模式匹配和 case 表达式,但两者都会导致解析器错误。

注意:我之前有一个名为 subs 的函数,它生成树的所有子树,包括它自身,但我不允许在我的 proper

定义中使用它

编辑:我解决了这个问题而不必定义一个新函数,但是 where 子句应该可以工作我一定是在脚本中搞砸了。现在的工作代码:

proper :: Tree a -> [Tree a]
proper (One a) = []
proper (Two t1 t2) = [t1,t2] ++ proper t1 ++ proper t2

是的,你可以:

proper :: Tree a -> [Tree a]
proper (One a) = []
proper (Two t1 t2) = [t1,t2] ++ proper' t1 ++ proper' t2
  where
    proper' (One a) = [One a]
    proper' (Two t1 t2) = [t1,t2] ++ proper' t1 ++ proper' t2

但是我看不出你需要什么proper',因为这段代码也能正常工作(与你的相反,它不会复制叶子):

proper :: Tree a -> [Tree a]
proper (One a) = []
proper (Two t1 t2) = [t1,t2] ++ proper t1 ++ proper t2