2017-02-06 10 views
1

ハスケルを新しくしました。私は再帰を使って以下のサブセットプログラムを理解するのが難しいと思っています。評価方法は?ハスケル再帰サブセット

subset :: [a] -> [[a]] 
subset [] = [[]] 
subset (x:xs) = [zs | ys <- subset xs, zs <- [ys,(x:ys)]] 

出力:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

私は手動で、それは以下のように合算されて評価するとき

マニュアル出力:[],[3],[2],[1,2]

私はあなたが私を助けてくださいすることができ、ここでいくつかのロジックをしないのです上記の再帰の概念と、ガード・ステートメントのどの部分を最初に評価するか、評価の順序を理解していますか?

+0

ヒント:大きなコードチャンクをフォーマットしてハイライトし、ctrl + kを押すだけです。のみ。小さな断片には '' 'sを使います。 – Carcigenicate

+1

最後の行がその結果を英語でどのように構成するかを表現してください。私はそれがどのように動作するかを明確にするだろうと思う。 – Thilo

+0

私はあなたが望むことをするこの1行の宝石を指摘するのを助けることはできません。それは 'Control.Monad'から' filterM'を使用します。 'サブセット= filterM(const [False、True])'。そしてそれだけで、あなたは 'サブセット'と同じ出力を(異なっていても)得るこ​​とができます - それはあまり効率的ではありません! – Alec

答えて

2

最後の行では、x:xsのサブセットのセットは、のサブセットのセットであり、これらのセットのそれぞれには、xが追加されています。

それを置く別の方法は、

zs <- [ys,(x:ys)] 

が正確に二組、xsのサブセットの一つである各ysためysx:ysを生成することです。