Haskell或其他函数式编程语言中是否存在范围概念?假设我想从BLAS计算I_AMAX(找到向量x中最大元素的最小索引)。天真的方法就像是
idamax x idx = foldr(imax) 0 (zip x idx)
其中idx是索引向量,imax返回索引最小且值最大的元组。
例如,一些矢量(比如,[1,7,3,5]),用它的索引向量([0,1,2,3]压缩,这使得[(1,0),(7, 1),(3,2),(5,2)]),然后用最大函数(so(7,1)或7)减少。
但索引知识应该是隐含的,因为在循环中索引是不言而喻的。有没有办法在Haskell中写这个?
tl;博士,在Haskell中编写I_AMAX的最佳方法是什么?
答案 0 :(得分:0)
这是一个版本:
idamax :: Ord a => [a] -> Int
idamax = negate . snd . maximum . flip zip [0, -1..]
首先请注意,zip
ping到列表会产生一个列表,其中包含最短输入列表的长度。因此,我们可以使用[0..]
将自然索引附加到列表元素:
zip [0..] [1, 7, 3, 5] = [(0, 1), (1, 7), (2, 3), (3, 5)]
所以我们做的是:
例如,从[1, 4, 2, 4]
开始:
[(1, 0), (4, -1), (2, -2), (4, -3)]
(4, -1)
(请注意(4, -1) > (4, -3)
)-1
1
>>> idamax [1..10]
9
>>> idamax [1, 3, 4, 2, 4]
2
>>> idamax "oh hello"
0