1

私は次のものを持っています:

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

AlphaInt型のvalを移動して合計する関数を定義しようとしています。私の望ましいアプローチは、すべてのIntを抽出してから結果のリストを合計することですが、再帰をどうするかわからないため、すべてのIntを抽出するのに苦労しています...

ちょっとした試み:

checkAlpha :: Alpha Int -> [Int]
checkAlpha (Beta a []) = [a]
checkAlpha (Beta a b) = [a] ++ (map checkAlpha b)

明らかにこれは完全には機能しませんが、解決策が見えません。

4

2 に答える 2

7

使用した場合

concatMap :: (a -> [b]) -> [a] -> [b]

の代わりにmap、それは機能し、十分にエレガントになります。

空のリストの場合を特別に2番目のコンポーネントとして扱う必要はありません。

checkAlpha :: Alpha a -> [a]
checkAlpha (Beta a alphas) = a : concatMap checkAlpha alphas

必要なことを実行し、パラメータタイプに依存しません。

于 2012-05-04T22:51:12.617 に答える
0

多くの便利な操作があるTreeの代わりに使用することを検討できます。Alpha

> flatten $ Node 1 [Node 2 [], Node 5 [Node 7 []]]
[1,2,5,7]
于 2012-05-05T01:33:52.397 に答える