Прежде всего, ваши функции могут быть написаны более просто как
func1 x = map (func2 x)
func2 x = map (*x)
Теперь легко изменить func2
, чтобы остановить, когда встречается отрицательное значение:
func2 x = map (*x) . takeWhile (> 0)
EDIT:
Так что, если я правильно понимаю, вы хотите, чтобы все вычисления потерпели неудачу, если встречается отрицательное значение. Один из способов сделать это - обернуть результат в Maybe
. Затем мы можем написать это в монадическом стиле:
func1 :: Int -> [[Int]] -> Maybe [[Int]]
func1 x = mapM (func2 x)
func2 :: Int -> [Int] -> Maybe [Int]
func2 x as = do
guard $ all (>= 0) as
return $ map (*x) as