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