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. Но нельзя из-за их бесконечности. Поэтому первое допущение работает. А следовательно монаду на этом типе реализовать нельзя.
no subject
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
. Но нельзя из-за их бесконечности. Поэтому первое допущение работает. А следовательно монаду на этом типе реализовать нельзя.