【发布时间】: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/<*>时,GHCI/Haskell怎么知道要调用什么函数?
其他语言的直觉告诉我们这应该是一个错误。有点像尝试在 OOP 语言中静态调用实例方法(显然不一样,但这是我得到的那种感觉)。
这是怎么回事?
【问题讨论】:
-
它的类型默认为downloads.haskell.org/~ghc/latest/docs/html/users_guide/…。
f也解析为IO,因为 ghci 在 IO monad 中运行。 -
谢谢!您介意发布一个答案以便我接受吗?