2016-10-17 7 views
5

ハスケルのリストの理解を書いて、すべての有限の整数列を列挙したいと思っています。整数のすべての有限シーケンスを列挙しますか?

私はこのセットが数えられると確信しています。

これは私がこれまで持っているものです。

enumIntSeqs = [ (x, [ (x, [0..x]) | x <- [ x | x <- [0..x] ] ]) | x <- [0..] ] 

私が持っているもう一つのアイデアは何とかZ * = {0、1、無限の配列

Z * XZ *内のすべての有限のパスをリストすることです、-1,2、-2、...}

+0

あなたの質問は非常に明確ではありません。 –

答えて

6

これは確かに可能です。しかし、それは容易ではありません。すべての整数の列挙、すべての整数対の列挙、すべての3重整数の列挙などがあるとします。次に、これらの列挙から「公平」を選択して、それぞれの各要素に確実に当てる必要があります。すべての対の整数を列挙しようとするときにも同様の問題が発生します。その問題から始めて、Control.Monad.Omega、おそらくはControl.Monad.Logicのようなものを調べることをお勧めします。

+3

最も関連性が高いのはおそらく['Data.Universe'](https://hackage.haskell.org/package/universe-1.0)です。 – user3237465

+3

右。 universe :: [[Integer]]は、[[]、[0]、[1]、[0,0]、[ - 1]、[1,0]、[0,1]、[2] 、[ - 1,0]、[1,1]、[0,0,0]、[ - 2]、[2,0]、[ - 1,1]、[1,0,0]、[0 、-1]、[3]、[ - 2,0]、[2,1]、[ - 1,0,0]、...] ' – leftaroundabout

+0

@ user3237465、それは最も直接的なパスのようです。私が言及した他の人たちがあなたをそこに連れて行くだろうと確信しています。 – dfeuer

4

私は完全な答えを試してあなたの楽しみを台無しにするつもりはないので、ゼロから始まるすべての有限で空でない連続した自然界の列挙という単純な問題を通して、既に自分で達成することに近いように思えます。キーステップはすでにenumIntSeqsの中にありますが、そのようなリスト内包をネストする必要はありません。あなたは

[ {- etc. -} | x <- [0..] ] 

...で始まる場合...あなたは、単に...

[ {- etc. -} | x <- [0..], let ys = [0..x] ] 

を行うことによって、各xのための新たなリストを生成することができます...そして、それらのリストを返す:

[ ys | x <- [0..], let ys = [0..x] ] 

(私はys <- [0..x]を書いていないことに注意してください。その場合に起こり、その後、GHCiの中でそれを確認どうなるかを予測するようにしてください。)

別々let定義が不要であり、またそれは、この単純な理解で明確にするという点では何も追加しないので、私たちはただ書くことができます。

[ [0..x] | x <- [0..] ] 

そして、それはそれです。

Prelude> take 4 $ [ [0..x] | x <- [0..] ] 
[[0],[0,1],[0,1,2],[0,1,2,3]] 

P.S .:列挙を書く他の2つの方法。 ...

someIntSeqs = do 
    x <- [0..] 
    return [0..x] 

をdo記法を使用して...と、と(この場合はmapと同じである)謙虚fmap

Prelude> take 4 $ fmap (\x -> [0..x]) [0..] 
[[0],[0,1],[0,1,2],[0,1,2,3]] 
Prelude> -- Or, equivalently... 
Prelude> take 4 $ (\x -> [0..x]) <$> [0..] 
[[0],[0,1],[0,1,2],[0,1,2,3]] 
関連する問題