foldr :
delete :: Int -> [a] -> [a]
delete index xs = let (ys, _:zs) = splitAt index xs in ys ++ zs
ifoldr :: (Int -> a -> b -> b) -> b -> [a] -> b
ifoldr f acc xs = foldr (\(a, b) c -> f a b c) acc $ zip [0..] xs
someFn :: (a -> b -> Bool) -> [a] -> [b] -> [[(a,b)]]
someFn _ [] _ = [[]]
someFn cond (a:as) bs = ifoldr (\index b acc -> if cond a b
then concat [map ((a,b):) . someFn cond as $ delete index bs, acc]
else acc) [] bs
, someFn _ [] _ = [[]], someFn :: (a -> b -> Bool) -> [a] -> [b] -> [[(a,b)]].
someFn :
someFn (\a b -> True) [1,2] "xyz"
-- [[(1,'x'),(2,'y')],
-- [(1,'x'),(2,'z')],
-- [(1,'y'),(2,'x')],
-- [(1,'y'),(2,'z')],
-- [(1,'z'),(2,'x')],
-- [(1,'z'),(2,'y')]]
someFn (\a b -> case (a,b) of (1,'x') -> False
(2,'y') -> False
otherwise -> True) [1,2] "xyz"
-- [[(1,'y'),(2,'x')],
-- [(1,'y'),(2,'z')],
-- [(1,'z'),(2,'x')]]
, .