【发布时间】:2017-10-01 07:41:17
【问题描述】:
埃拉托色尼筛法可以在 Haskell 中非常巧妙地实现,利用惰性生成一个无限列表,然后从其尾部删除列表头部的所有倍数:
primes :: [Int]
primes = sieve [2..]
sieve (x:xs) = x : sieve [y | y <- xs, y `mod` x > 0]
我正在尝试学习如何在 Java 8 中使用流,但我想知道是否有一种方法可以在 Java 中实现与上面的 Haskell 代码相同的结果。如果我将 Haskell 惰性列表视为等同于 Java 流,似乎我需要获取一个以 2 为首的流并生成一个删除所有 2 倍数的新流,然后获取该流并生成一个包含所有移除了 3 的倍数,并且...
我不知道如何继续。
有没有办法做到这一点,或者当我试图将 Java 流视为与 Haskell 列表相当时,我是在自欺欺人吗?
【问题讨论】:
-
“当我试图将 Java 流与 Haskell 列表相媲美时,我是在自欺欺人吗” - 我会说是的。 也许你可以做类似的事情,但在 Java 中做起来肯定会更复杂。
-
使用过 C# (LINQ) 和 Haskell,我只能说让 Java 的流来做类似的事情并不简单。我建议更接近惯用的 Java。恕我直言,Java 缺乏清晰简洁地表达这些复杂想法的内置插件。
-
@Holger 是的,“stream”对于那些来自“java”标签的人来说是多余的,但是对于那些来自“haskell”甚至只是“筛子-of-eratosthenes”的人来说呢? “更有意义?将“流”作为附加标签有什么害处?
-
@Holger 因为惰性列表是流?
标签: java haskell java-stream primes sieve-of-eratosthenes