Haskell如何知道你指的是哪个类型类实例?

J C*_*per 4 haskell type-inference typeclass

这个问题出现在阅读关于应用函子的优秀的Learn You a Haskell的新篇章中.

作为Maybe实例的定义的一部分,Applicative类型类具有:

pure = Just
Run Code Online (Sandbox Code Playgroud)

如果我只是去GHCi并导入Control.Applicative,并执行:

pure (3+)
Run Code Online (Sandbox Code Playgroud)

我没有得到任何东西(有道理).但是,如果我在表达式的一部分中使用它:

pure (3+) <*> Just 4
Run Code Online (Sandbox Code Playgroud)

我得到的只是7.我想这也就不足为奇了,但是我错过了关于类型类如何工作的一些不可或缺的东西,我认为,pure这里的调用没有含糊之处.

如果我的困惑有意义,任何人都可以详细解释发生了什么吗?

new*_*cct 7

这只是类型推断.该(<*>)运营商既需要参数使用相同的Applicative实例.右边是a Maybe,所以左边也必须是a Maybe.这就是它如何确定这里使用的实例.您可以通过键入来查看解释器中任何表达式的类型:t expression,也许如果您只是浏览每个子表达式并查看推断的类型,您将更好地了解正在发生的事情.

  • 类型推断非常复杂,但值得知道它不会一步到位.类型推断器通常在一个步骤中收集一些信息,在稍后阶段收集更多信息.所以它不只是从左到右一次推断出所有事物的正确类型.在这种情况下,它将推断`pure`是类型`(Applicative a1)=> a1(Int - > Int)`其中`a1`只是一个组合类型变量,在类型推断的后期阶段它将得出结论:"a1"必须是"可能",然后它会在所有地方用"Maybe"代替"a1". (9认同)