gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:35:55 24 4
gpt4 key购买 nike

我有以下代码:

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

最佳答案

是的,这是 ghci 的一个没有详细记录的角落。当您在 ghci 中输入表达式时,它会使用表达式的类型来决定要执行的操作:

  1. IO ():运行操作,不执行任何进一步操作。
  2. Show a => IO a:运行操作并打印结果。
  3. 任何其他IO a:运行操作,不执行任何进一步操作。
  4. 任何其他内容:用 print 包装整个表达式。

它如何决定一个事物属于哪一种类型?简单:它尝试统一上述每个签名的表达式类型,并解决所有由此产生的约束。 (对于行家来说:这是扩展默认规则的补充!这解释了为什么它似乎默认了m,尽管标准默认规则和扩展默认规则都没有。默认规则规定了使用什么默认值。)

因此,由于您的表达式未与 IO () 统一,但与 Show a => IO a 统一,ghci 会找到 m ~ IO code>(和 a ~ Int)在统一期间,发现有一个 MonadPlus IO (和一个 Show Int)实例来解决约束,运行您的操作,并打印结果。

关于haskell - Haskell 中 MonadPlus 的默认类型评估是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com