У меня есть следующий код:
import Control.Monad
coin :: MonadPlus m => m Int
coin = return 0 `mplus` return 1
Если я оцениваю coin :: Maybe Int
в интерпретаторе, он выводит Just 0
. Это нормально из-за реализации Maybe как экземпляра MonadPlus.
Если я оцениваю coin :: [Int]
в интерпретаторе, он печатает [0, 1]
, потому что реализация mplus
в списке — это append
.
Но если я оцениваю coin
без каких-либо декораторов типов, он печатает 0
. Почему? Какой тип интерпретатор "преобразует" coin
для его оценки?
Этот код взят с: http://homes.sice.indiana.edu/ccshan/rational/S0956796811000189a.pdf