http://lomeo.livejournal.com/ ([identity profile] lomeo.livejournal.com) wrote in [personal profile] lomeo 2006-07-06 12:43 pm (UTC)

data S a = S a (S a)

return можно реализовать только как (всякие bottom отбрасываем, разумеется)

return x = S x (return x)

Тогда первый закон
return x >>= f == f x
или
(S x (return x)) >>= f == f x

Т.к. тип x :: forall a. a, то нам можно только вытащить x из одного места этого потока. Логично предположить (первое допущение), что это первый элемент (это второе допущение в написании монады). Первый закон тогда работает, а второй нет:

m >>= return == m
m@(S x xs) >>= return = return x /= m


И всё было бы хорошо, если бы (см. первое допущение) можно было бы делать операцию объединения нескольких потоков в один. Как у списка concat. Но нельзя из-за их бесконечности. Поэтому первое допущение работает. А следовательно монаду на этом типе реализовать нельзя.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting