在ghci:
λ> :t (pure 1)
(pure 1) :: (Applicative f, Num a) => f a
λ> show (pure 1)
<interactive>:1:1:
No instance for (Show (f0 a0))
arising from a use of `show'
Possible fix: add an instance declaration for (Show (f0 a0))
In the expression: show (pure 1)
In an equation for `it': it = show (pure 1)
λ> pure 1
1
这是否意味着ghci执行Applicative并显示结果,就像IO
一样?
请注意,pure ()
和pure (+1)
不会打印任何内容。
答案 0 :(得分:11)
如果您使用return
而不是pure
,则会出现相同的行为。要找出要做的事情,ghci必须为给定的表达式选择一种类型。 ghci的默认规则是这样的,如果没有其他约束,它会为IO
或Applicative
实例选择Monad
。因此,它将pure 1
解释为类型IO Integer
的表达式。如果1. IO a
有一个a
实例,而Show
不是a
,则会在提示符处输入()
类型的表达式并打印其结果}。因此,在提示符下输入pure 1
会导致
v <- return (1 :: Integer)
print v
return v
正在执行(以及与返回的it
绑定的魔术变量v
)。对于pure ()
,特殊情况适用,因为()
被视为无趣,因此只有return ()
被执行而it
被()
绑定到pure (+1)
,返回一个函数,范围内的函数没有Show
实例,因此不会打印任何内容。然而,
Prelude Control.Applicative> :m +Text.Show.Functions
Prelude Control.Applicative Text.Show.Functions> pure (+1)
<function>
it :: Integer -> Integer
Prelude Control.Applicative Text.Show.Functions> it 3
4
it :: Integer
在作用域中有一个Show
实例,它被打印出来(不是它的信息),然后可以使用该函数(后者独立于范围内的Show
实例,当然)。