繁体   English   中英

Haskell代数数据类型模式匹配

[英]Haskell algebraic data type pattern matching

我有以下几点:

data Alpha a = Beta a [Alpha a]
val = Beta 1 [Beta 2 [], Beta 5 [Beta 7 []]]

我试图定义一个函数,该函数将在Alpha Int类型的v​​al上移动并将其求和。 我想要的方法是提取所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM