ghci适用特殊情况?

gaw*_*awi 8 monads haskell ghci applicative

在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
Run Code Online (Sandbox Code Playgroud)

这是否意味着ghci执行Applicative并显示结果,就像IO

请注意,pure ()并且pure (+1)不打印任何内容.

Dan*_*her 11

如果使用return而不是,则会得到相同的行为pure.要找出要做的事情,ghci必须为给定的表达式选择一种类型.ghci的默认规则是没有其他约束的,它选择IO一个Applicative或一个Monad实例.因此它将其解释pure 1为类型的表达IO Integer.IO a如果1. a具有Show实例而2 a则不是,则执行在提示符处输入的类型的表达式并打印其结果().因此输入pure 1提示结果

v <- return (1 :: Integer)
print v
return v
Run Code Online (Sandbox Code Playgroud)

正在执行(以及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
Run Code Online (Sandbox Code Playgroud)

Show对于范围内的函数的实例,它被打印(不是它的信息),然后可以使用该函数(当然,后者独立Show于范围内的实例).

  • 我刚刚意识到`instance Applicative IO`.所以它也允许`pure 1 >> =\it - > print it`工作.我刚刚学习了`Text.Show.Functions`模块.我一直想知道为什么函数默认不显示. (2认同)