枚举整数的所有有限序列?

时间:2016-10-17 03:58:25

标签: haskell list-comprehension

我想编写一个Haskell列表解析来枚举所有有限的整数序列。

我很确定这套装是可数的。

这是我到目前为止所做的:

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

我的另一个想法是以某种方式列出无限数组中的每个有限路径

Z * X Z *其中Z * = {0,1,-1,2,-2,...}

2 个答案:

答案 0 :(得分:6)

这确实是可能的。但这并不容易。想象一下,你有一个所有整数的枚举,所有整数对的枚举,所有三元组整数的枚举等等。然后你需要从这些枚举中选择“公平”,以确保击中每个整数。当你甚至尝试枚举所有整数对时,会出现类似的问题。我建议你从这个问题开始,然后查看类似Control.Monad.Omega或甚至Control.Monad.Logic的内容。

答案 1 :(得分:4)

我不会通过尝试一个完整的答案来破坏你的乐趣,所以让我通过枚举所有有限的,非空的,从零开始的连续自然序列的简化问题来展示一些事情 - 这是你似乎已经接近自己的成就了。关键步骤已经在您的enumIntSeqs中,但您不必像这样嵌套列表推导。如果你开始......

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

...您可以通过执行... {/ p>为每个x生成一个新列表

[ {- etc. -} | x <- [0..], let ys = [0..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。:另外两种编写枚举的方法。使用do-notation ......

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

...并且谦虚fmap(在这种情况下与map相同):

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]]