Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
Functional programming 如何用任意类型的memo编写reduce函数_Functional Programming_Julia_Reduce - Fatal编程技术网

Functional programming 如何用任意类型的memo编写reduce函数

Functional programming 如何用任意类型的memo编写reduce函数,functional-programming,julia,reduce,Functional Programming,Julia,Reduce,我正在尝试编写一个简单的直方图程序,该程序只获取未知(非常大)长度的整数流,并将它们存储起来。我的问题与装箱无关,因此我们可以假设整数可以在范围(0,1000)内,直方图箱子的大小为1(每个可能的数字都有自己的箱子) 通常我会使用reduce及其任何编程语言的变体来实现这一点,我会在Julia中编写类似的代码(使用数组代替我使用的实际基于文件的迭代器作为输入): 现在,我尝试了一些变体,如更改参数顺序等,但得到了各种看似类型或签名相关的问题: ERROR: MethodError: no met

我正在尝试编写一个简单的直方图程序,该程序只获取未知(非常大)长度的整数流,并将它们存储起来。我的问题与装箱无关,因此我们可以假设整数可以在范围(0,1000)内,直方图箱子的大小为1(每个可能的数字都有自己的箱子)

通常我会使用
reduce
及其任何编程语言的变体来实现这一点,我会在Julia中编写类似的代码(使用数组代替我使用的实际基于文件的迭代器作为输入):

现在,我尝试了一些变体,如更改参数顺序等,但得到了各种看似类型或签名相关的问题:

ERROR: MethodError: no method matching reduce(::typeof(ct_b), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching reduce(::typeof(ct_a), ::Array{Int64,1}, ::Array{Int64,1})
ERROR: MethodError: no method matching setindex!(::Int64, ::Int64, ::Int64)
这似乎应该是可行的,因为一个
reduce
操作的输出没有正式的理由需要类似于被迭代的单个元素的类型。然而,我在网上找到的关于在julia中使用
reduce
的每个例子都假设备忘录(输出)是类似的类型(也就是说,传入的
op
操作符的类型是
F:T,T->T
)这似乎是一个任意的限制,不太可能是这样,但我不知道如何做不同

通过使用类似于
F:T,T->null的函数并全局存储备忘录,我以某种方式绕过了这个问题:

memo=zeros(1000)

function ct_x(_, i)
        memo[i] += 1
end

reduce(ct_x, [1,2,3,100,200,900], init="whatever")

是否有一种表达这种性质的reduce函数的方法?

您需要reduce函数返回修改后的数组,而不是修改后的元素值。请尝试以下方法:

function ct_a(arr, i)
    arr[i] += 1
    arr
end
function ct_a(arr, i)
    arr[i] += 1
    arr
end
julia> reduce(ct_a, [2, 3, 4], init=zeros(Int, 5))
5-element Array{Int64,1}:
 0
 1
 1
 1
 0