Я вообще не понимаю, что это за вопрос :), но вот как я бы это реализовал:
modifyNth :: Int -> (a -> a) -> [a] -> [a]
modifyNth n f (x:xs)
| n == 0 = f x : xs
| otherwise = x : modifyNth (n-1) f xs
replaceNthMth :: Int -> Int -> a -> [[a]] -> [[a]]
replaceNthMth m n v = modifyNth m (modifyNth n (const v))
Таким образом, вам не нужно дважды просматривать список (в первый разс !!
, второй раз с replaceNth
)