相关疑难解决方法(0)

Haskell中MonadPlus的默认类型评估是什么?

我有以下代码:

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

monads haskell non-deterministic

6
推荐指数
1
解决办法
118
查看次数

我想我找到了“不存在的单子”

我发现了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” …

monads haskell default ghci

4
推荐指数
1
解决办法
173
查看次数

标签 统计

haskell ×2

monads ×2

default ×1

ghci ×1

non-deterministic ×1