[e, ix] = min(X);
min x = z $ foldl' f (e,0,0) es
where
(e:es) = toList x
f (a,ix,r) b = let ix' = ix+1 in if a < b then (a,ix',r) else (b,ix',ix')
z (a,ix,r) = (a,r)
min x = traverse x to0D min
where
to0D (Z:.i) = Z
min f (Z) = ??? -- how to get elements for comparison?
[f (Z:.i) | i <- [1..n]], where n = ((Z:.i) -> i) $ extent x
import Data.Array.Repa
indexed arr = traverse arr id (src idx@(Z :. i) -> (src idx, i))
minimize arr = foldP f h t
where
(Z :. n) = extent arr
arr' = indexed arr
h = arr' ! (Z :. 0)
t = extract (Z :. 1) (Z :. (n-1)) arr'
f min@(valMin, iMin) x@(val, i) | val < valMin = x
| otherwise = min
{-# LANGUAGE TypeOperators, FlexibleContexts #-}
import Data.Array.Repa
idx :: Int -> (Z :. Int)
idx n = Z :. n
(//) :: Source U e => Array U (Z :. Int) e -> Int -> e
(//) v n = v ! (idx n)
min' n v = m 0
where m p | p == n - 1 = (v // p, p)
| True = if x < x' then (x, p) else (x', p')
where (x', p') = m (p + 1)
x = v // p
v2 :: Array U (Z :. Int) Int
v2 = fromListUnboxed (idx 6) [7, 2, 9, 3, 0, 5]
example = min' 6 v2
-- OUT: (0, 4)