ap [f1, f2] [x1, x2] = [f1 x1, f2 x2]인데,
ap [f1, f2] [x1, x2] = do { f ← [f1, f2]; x ← [x1, x2]; return (f x); }이다.
그러므로 [f1 x1, f2 x2] == [f1, f2] >>= (f => [x1, x2] >>= (x => return (f x)))이다.
여기서 표기 v => e는 식 e의 변수 v에 대한 람다식을 나타낸다.
그런데 x >>= f = join (fmap f x)이므로,
fmap의 유일성에 의하여,
[f1 x1, f2 x2] == join [join [repeat (f1 x1), repeat (f1 x2)], join [repeat (f2 x1), repeat (f2 x2)]]이다.
여기서 조금만 생각해 보면 join이 대각선을 뽑는 함수가 아니기 힘듦을 알 수 있다.
댓글 1