Итак, мы должны иметь
mapFunc (*) [[1,2,3], [4, 5, 6]] [1,2,3]
== [[1,4,9], [4,10,18]]
и так, также
mapFunc (*) [[1,2,3], [4, 5, 6], [7, 8, 9, 10]] [1,2,3]
== [[1,4,9], [4,10,18], [7, 14, 27] ]
-- and
mapFunc (*) [[1,2,3]] [1,2,3]
== [[1,4,9]]
-- and
mapFunc (*) [[4, 5, 6], [7, 8, 9, 10]] [1,2,3]
== [[4,10,18], [7, 14, 27] ]
Таким образом,
mapFunc (*) ([[1,2,3]] ++ [[4, 5, 6], [7, 8, 9, 10]]) [1,2,3]
== (mapFunc (*)
[[1,2,3]] [1,2,3])
++
(mapFunc (*) [[4, 5, 6], [7, 8, 9, 10]] [1,2,3])
Хотя в этих конкретных числах нет ничего особенного, поэтому мы обязательно должны иметь
mapFunc (*) ( [xs] ++ xss ) ys =
= (mapFunc (*) [xs] ys ++ mapFunc (*) xss ys)
= ([g xs ys] ++ mapFunc (*) xss ys)
потому что, как мы видим из наших примеров, (\xss -> mapFunc (*) xss ys)
является сохраняющим длину преобразованием.
Так какой должна быть эта g
функция?
пена, промыть, повторить:
Мы должны иметь
g [1,2,3] [1,2,3] == [1,4,9]
g [4,5,6] [1,2,3] == [4,10,18]
g [7,8,9,10] [1,2,3] == [7,14,27]
и, таким образом, снова обобщая, поскольку числа сами по себе ничего особенного,
g xs ys = [ (*) x y | x <- xs | y <- ys ]
и это все.