Haskell 在ghci中调用泛型函数的结果时显示
当使用特定类型类的函数,但不指定所需的具体类型时,我对GHCI中的这一点有点困惑。考虑下面的代码:Haskell 在ghci中调用泛型函数的结果时显示,haskell,typeclass,Haskell,Typeclass,当使用特定类型类的函数,但不指定所需的具体类型时,我对GHCI中的这一点有点困惑。考虑下面的代码: pure (1+) <*> pure 1 > 2 好的,很公平,这些类型看起来很合理,但是从来没有指定任何类型类实例,那么当我编写pure/时,GHCI/Haskell如何知道调用什么函数呢 其他语言的直觉告诉我们,这应该是一个错误。有点像在OOP语言中尝试静态调用实例方法(显然不一样,但我有这种感觉) 这是怎么回事?这是因为ghci有两个特点: ,它将Num b=>b解析为I
pure (1+) <*> pure 1
> 2
好的,很公平,这些类型看起来很合理,但是从来没有指定任何类型类实例,那么当我编写pure
/
时,GHCI/Haskell如何知道调用什么函数呢
其他语言的直觉告诉我们,这应该是一个错误。有点像在OOP语言中尝试静态调用实例方法(显然不一样,但我有这种感觉)
这是怎么回事?这是因为ghci有两个特点:
Num b=>b
解析为Integer
(请注意1
实际上是from Integer 1
,您可以定义(但不推荐)一些数值数据类型,其中from Integer 1+from Integer 1==k
和显示k==“3”
,因此这很重要):Applicative f=>f
被解析为IO
。如果表达式的类型为C1 f=>f a
,并且IO
不是该类型类的实例C1
,则ghci将引发歧义错误这是由于ghci的两个特点:
Num b=>b
解析为Integer
(请注意1
实际上是from Integer 1
,您可以定义(但不推荐)一些数值数据类型,其中from Integer 1+from Integer 1==k
和显示k==“3”
,因此这很重要):Applicative f=>f
被解析为IO
。如果表达式的类型为C1 f=>f a
,并且IO
不是该类型类的实例C1
,则ghci将引发歧义错误这是默认类型。当ghci在IO monad中运行时,
f
也解析为IO
。谢谢!你介意发布一个答案让我接受吗?这是默认类型。当ghci在IO monad中运行时,f
也解析为IO
。谢谢!你介意把答案贴出来让我接受吗?
pure (1+) <*> pure 1 :: (Num b, Applicative f) => f b