Man*_*lVS 6 monads haskell non-deterministic
我有以下代码:
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
是的,这是一个没有超级记录的ghci角落.当您在ghci中输入表达式时,它使用表达式的类型来决定要执行的操作:
IO ():运行操作,不再做任何事情.Show a => IO a:运行操作和print结果.IO a:运行动作,不做任何进一步的操作.print.它如何决定这些类型中的哪一种?简单:它试图统一表达式的类型,上面的每个签名依次解决所有结果约束.(对于cognoscenti:这是除了扩展的默认规则之外!这解释了为什么它似乎是默认的m,即使扩展的默认规则也没有说明默认使用什么.)
因此,由于您的表达式不统一IO ()但与之统一Show a => IO a,ghci 在统一期间找到m ~ IO(和a ~ Int),发现有MonadPlus IO(和Show Int)实例来解析约束,运行您的操作并打印结果.