Для первого pure
закон тождество действительно не . Действительно, этот закон гласит:
pure id <*> v = v
Таким образом, это означает, что:
ZipList' (Cons id Nil) <*> <i>v</i> = <i>v</i>
для всех v
с. Но это не так. Скажите, что v = ZipList' (Cons 1 (Cons 2 Nil))
, так что в основном список [1,2]
. Тогда можно ожидать, что:
ZipList' (Cons id Nil) <*> ZipList' (Cons 1 (Cons 2 Nil)) = ZipList' (Cons 1 (Cons 2 Nil))
Если мы, однако, оценим вашу реализацию для Applicative
, мы увидим, что:
ZipList' (Cons id Nil) <*> ZipList' (Cons 1 (Cons 2 Nil))
= ZipList' (applicate (Cons id Nil) (Cons 1 (Cons 2 Nil)))
= ZipList' (Cons (id 1) (applicate Nil (Cons 2 Nil)))
= ZipList' (Cons 1 Nil)
Но это не то, что мы ожидаем от закона об идентичности, так как здесь мы получаем ZipList'
, который в основном равен [1]
, тогда как он должен быть [1,2]
.