我想编写一个Haskell列表解析来枚举所有有限的整数序列。
我很确定这套装是可数的。
这是我到目前为止所做的:
enumIntSeqs = [ (x, [ ( x, [0..x] ) | x <- [ x | x <- [0..x] ] ] ) | x <- [0..] ]
我的另一个想法是以某种方式列出无限数组中的每个有限路径
Z * X Z *其中Z * = {0,1,-1,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]]