【发布时间】:2012-05-04 22:47:46
【问题描述】:
我有以下:
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)
显然这不太有效,但我看不到解决方案。
【问题讨论】:
-
在您的函数中,
b的类型为[Alpha Int]。在此列表上映射checkAlpha会得到[[Int]],但您的签名表明您想要返回[Int]。这就是为什么您必须将列表“折叠”成一层 - 即(concat .) . map也称为concatMap。 -
最小的修复方法是在代码中的
(和map checkAlpha b)之间插入concat $,以使列表列表变平一层。然后你注意到第一个子句是第二个子句的一个实例,因为map _ [] === []。然后将[a]++替换为a:以得出Daniel 的解决方案。所以你真的很亲近。 :)
标签: haskell pattern-matching algebraic-data-types