我有以下内容:
data Alpha a = Beta a [Alpha a]
val = Beta 1 [Beta 2 [], Beta 5 [Beta 7 []]]
我正在尝试定义一个函数,该函数将移动到 Alpha Int 类型的值上并对其进行求和。我想要的方法是提取所有 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]