[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)