我有以下代码:
import Control.Monad
coin :: MonadPlus m => m Int
coin = return 0 `mplus` return 1
Run Code Online (Sandbox Code Playgroud)
如果我对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
我发现了Haskell的怪异特征,这使我相信我在错误地思考。我认为在Haskell中,应该有一些“不存在”的 monad。这是由于以下原因。
Prelude> return 1
1
Prelude> return 1 >>= \x -> if even x then return True else return False
False
Run Code Online (Sandbox Code Playgroud)
>>=是类型的m a -> (a -> m b) -> m b,其中m可以是任何单子。我的理论是这样的:由于return 1评估仅是1,return 1可以认为是1提升为包裹在“不存在”单子内部的值。Haskell抓住了这一事实并评估了整个表达式
return 1 >>= \x -> if even x then return True else return False
Run Code Online (Sandbox Code Playgroud)
到False,因为它必须产生一个“不存在False”,其仅是一个False。
但是,我以前从未听说过这种“不存在”的单子。
我确信我用错误的方式对其进行了理论化,因为如果“不存在1” …