Haskell和其他编程语言中的I_AMAX - RANGE

时间:2014-05-19 13:11:57

标签: haskell design-patterns functional-programming range blas

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的最佳方法是什么?

1 个答案:

答案 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. 将(否定的)索引附加到列表中的每个元素
  2. 找到一个具有最大值和最小索引的对(由于先前的否定而在此处为最大值)
  3. 从结果对中提取索引
  4. 否定它回来
  5. 例如,从[1, 4, 2, 4]开始:

    1. 附加索引:[(1, 0), (4, -1), (2, -2), (4, -3)]
    2. 找到最大值:(4, -1)(请注意(4, -1) > (4, -3)
    3. 提取索引:-1
    4. 否定:1
    5. 实施例

      >>> idamax [1..10]
      9
      >>> idamax [1, 3, 4, 2, 4]
      2
      >>> idamax "oh hello"
      0