Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哈斯克尔的等价物是什么;用Java';什么是溪流?_Java_Haskell_Java Stream - Fatal编程技术网

哈斯克尔的等价物是什么;用Java';什么是溪流?

哈斯克尔的等价物是什么;用Java';什么是溪流?,java,haskell,java-stream,Java,Haskell,Java Stream,至于python,在Java的流中,Haskell的scanl的等价物是什么 到目前为止,我想到的最好的方法就是使用 reduce(identity, accumulator, combiner) 使用一个累加器,该累加器保存最新的结果并将结果累加到列表中,尽管合并器可能不会被使用。我也不知道如何防止它被并行使用,因为它不起作用 也许Stream是scanl的(等价物)的错误接口?看起来标准Stream API没有scanl等价物。其中一个原因是,scanl是严格的从左到右的操作,这使得它很难

至于python,在Java的流中,Haskell的scanl的等价物是什么

到目前为止,我想到的最好的方法就是使用

reduce(identity, accumulator, combiner)
使用一个累加器,该累加器保存最新的结果并将结果累加到列表中,尽管合并器可能不会被使用。我也不知道如何防止它被并行使用,因为它不起作用


也许Stream是scanl的(等价物)的错误接口?

看起来标准Stream API没有
scanl
等价物。其中一个原因是,
scanl
是严格的从左到右的操作,这使得它很难从并行处理中获益(并行处理是streamapi的一个重要部分)。但是,您可以使用第三方库,如我的免费库。它扩展了标准流API,添加了更多有用的函数,包括:

List List=IntStreamEx.range(10.boxed().scanlight(整数::总和);
系统输出打印项次(列表);
//输出[0,1,3,6,10,15,21,28,36,45]

这个
scanLeft
操作保证即使在并行流中也能工作,但是除非您有一些计算密集型的上游操作,这些操作可以并行化,否则您不可能获得加速。

我知道OP要求流,但是如果您使用阵列,您也可以考虑<代码>数组。例如
Arrays.parallelPrefix(arr,Integer::sum)。这不是一个严格的扫描,因为我认为它需要一个初始值和一个二进制运算符,但是…@AlexisC.,是的,这是一个很好的加法(考虑写下你的答案!)。但是需要注意的是,
parallelPrefix
需要一个像
reduce
这样的关联函数。是的,
Stream
在这里不是正确的接口。Java的流只提供可以高效并行的操作,而不包括带有任意操作的scanl。
List<Integer> list = IntStreamEx.range(10).boxed().scanLeft(Integer::sum);
System.out.println(list);
// outputs [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]