[英]Haskell algebraic data type pattern matching
我有以下几点:
data Alpha a = Beta a [Alpha a]
val = Beta 1 [Beta 2 [], Beta 5 [Beta 7 []]]
我试图定义一个函数,该函数将在Alpha Int类型的val上移动并将其求和。 我想要的方法是提取所有Int,然后对结果列表求和,但是由于我不知道如何处理递归,我一直在努力提取所有Int。
稍作尝试:
checkAlpha :: Alpha Int -> [Int]
checkAlpha (Beta a []) = [a]
checkAlpha (Beta a b) = [a] ++ (map checkAlpha b)
显然,这不太可行,但是我看不到解决方案。
如果你用过
concatMap :: (a -> [b]) -> [a] -> [b]
而不是map
,它会工作并且足够优雅。
您无需将空列表的情况专门视为第二部分,
checkAlpha :: Alpha a -> [a]
checkAlpha (Beta a alphas) = a : concatMap checkAlpha alphas
完成所需的操作,并且与参数类型无关。
您可以考虑使用Tree
而不是Alpha
,它具有许多方便的操作:
> flatten $ Node 1 [Node 2 [], Node 5 [Node 7 []]]
[1,2,5,7]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.