我有以下代码:
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
pure我对其 Applicative 实例未指定的情况下的行为有点困惑。在此示例中,我希望在应用上下文中结果值为数字 5:
Prelude> pure 5 :: Applicative t => t Integer
5
Prelude> :t it
it :: Integer
Run Code Online (Sandbox Code Playgroud)
相反,它只是一个普通的整数。
如果指定了应用实例,如以下示例所示,则返回的值是应用类型,正如我所期望的:
Prelude> pure 5 :: Maybe Integer
Just 5
Prelude> :t it
it :: Maybe Integer
Run Code Online (Sandbox Code Playgroud)
为什么Applicative t第一个例子中的 似乎消失了?
似乎未指定的应用上下文被剥离以用于最终评估以打印到输出,但我想知道这的规则是什么。