Haskell代数数据类型模式匹配

Tob*_*bi3 1 haskell pattern-matching algebraic-data-types

我有以下内容:

data Alpha a = Beta a [Alpha a]
val = Beta 1 [Beta 2 [], Beta 5 [Beta 7 []]]
Run Code Online (Sandbox Code Playgroud)

我正在尝试定义一个将在Alpha Int类型的v​​al上移动并对其求和的函数.我想要的方法是提取所有的Ints然后对结果列表求和,但我正在努力提取所有的Int,因为我不知道如何处理递归...

轻微的尝试:

checkAlpha :: Alpha Int -> [Int]
checkAlpha (Beta a []) = [a]
checkAlpha (Beta a b) = [a] ++ (map checkAlpha b)
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,但我看不到解决方案.

Dan*_*her 7

如果你用过

concatMap :: (a -> [b]) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

而不是map,它会工作,并且足够优雅.

您不需要特别将空列表的情况视为第二个组件,

checkAlpha :: Alpha a -> [a]
checkAlpha (Beta a alphas) = a : concatMap checkAlpha alphas
Run Code Online (Sandbox Code Playgroud)

做你想要的,并且独立于参数类型.