cross_inf ::  (a->b->c) -> [a] -> [b] -> [[c]]
cross_inf f xs ys = do
    xs' <- tail $ inits xs
    return $ zipWith f (reverse xs') ys
cross_inf ::  (a->b->c) -> [a] -> [b] -> [[c]]
cross_inf f xs ys = do
    xs' <- tail $ inits xs
    return $ zipWith f (reverse xs') ys
cross_inf f xs ys = do
    xs' <- tail $ inits xs
    return $ zipWith f (reverse xs') ys