【问题标题】:Calling show on results from generic functions in ghci在 ghci 中调用泛型函数的结果显示
【发布时间】:2016-04-16 15:55:03
【问题描述】:

当您使用特定类型类的函数但没有指定您想要的具体类型时,我对 GHCI 中的这个东西有点困惑。考虑以下代码:

pure (1+) <*> pure 1
> 2

按照我的理解,当您在 GHCI 中输入内容时,它会评估表达式并在其上调用 putStrLn . show。但这怎么评价呢?为什么是这个2?我的意思是,这是有道理的,对于大多数 Applicative 实例来说它可能是 2,但是没有办法确定,对吧?如果我们检查我们得到的表达式的类型:

pure (1+) <*> pure 1 :: (Num b, Applicative f) => f b

好吧,很公平,类型看起来很合理,但是从来没有指定任何类型类实例,那么当我写pure/&lt;*&gt;时,GHCI/Haskell怎么知道要调用什么函数?

其他语言的直觉告诉我们这应该是一个错误。有点像尝试在 OOP 语言中静态调用实例方法(显然不一样,但这是我得到的那种感觉)。

这是怎么回事?

【问题讨论】:

标签: haskell typeclass


【解决方案1】:

这是由于 ghci 的两个特性:

  1. type defaulting,将Num b =&gt; b 解析为Integer(注意1 实际上是fromInteger 1,您可以定义——但不推荐——一些数字数据类型,其中fromInteger 1 + fromInteger 1 == kshow k == "3",所以这很重要):
  2. 整个ghci在IO monad中运行,if an expression can be instantiated to an IO action, then it will be,所以Applicative f =&gt; f被解析为IO。如果表达式是 C1 f =&gt; f a 类型,并且 IO 不是该类型类 C1 的实例,则 ghci 将引发歧义错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多