Читая ветку под оригинальным постом, я пришел к выводу, что автор поста пытается доказать, что реализация удовлетворяет закону (fmap f xs = (pure f) <*> xs
):
Давайте попробуем доказать это как классическийличность, избавляясь от обертки. Итак, давайте поработаем с правой рукой:
(pure f) <*> xs = (repeat' f) <*> xs = zipWith' ($) (repeat' f) xs
;
Что касается идентичности, достаточно доказать, что zipWith' ($) (repeat' f) xs
равно fmap f xs
.
Причина, по которой они одинаковые, довольно очевидна:
length (zipWith op xs ys) == min (length xs) (length ys)
;(это выражение не может быть оценено в случае, когда xs
и ys
бесконечны).
Поскольку repeat' f
бесконечно, length $ zipWith' ($) (repeat' f) xs
фактически является length xs
(здесь онона самом деле не имеет значения, существует ли такая величина: было бы достаточно наличия индексов). Каждый элемент xs
применяется к той же функции f
, которая повторяется. Как видите, размер сохраняется, и каждый элемент трансформируется в постоянную функцию, которая является определением fmap
.