我可以使用 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
我的目标是定义一个函数“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