isSquare xs = all (True &&) (map (\(ys,_) -> length xs == length ys) xs) multAndAdd a xs ys = add (mul a xs) ys where mul a (xs,y) = (map (a*) xs, a*y) add (xs,y) (ys,z) = (zipWith (+) xs ys, y+z) reorder fkt xs = rH xs [] where rH [] ys = ys rH (x:xs) ys | fkt x = x:(ys++xs) | otherwise = rH xs (ys++[x])