如何在应用了类型默认规则的ghci中打印多态函数(或值)的类型?

She*_*rsh 7 polymorphism haskell types ghci monomorphism-restriction

当我:t在GHCi中输入命令时,我看到多态类型:

ghci> :t 42
42 :: Num t => t
ghci> :t div
div :: Integral a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

但在我实际评估这些函数后,我看到了类型默认规则的结果.是否有一些命令或能力在ghci中观察在根据Haskell报告和/或ghc实现应用类型默认规则后将如何更改类型?

lef*_*out 5

您可以通过启用单态限制然后将其绑定到新名称来执行此操作:

Prelude> :set -XMonomorphismRestriction 
Prelude> let n = 42
Prelude> :t n
n :: Integer
Prelude> let p = (^)
Prelude> :t p
p :: Integer -> Integer -> Integer
Prelude> let e = (**)
Prelude> :t e
e :: Double -> Double -> Double
Prelude> let d = div
Prelude> :t d
d :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

如果您不想总是定义一个新变量,可以通过使用来解决这个问题

Prelude> :def monotype (\e -> return $ ":set -XMonomorphismRestriction\nlet defaulted = "++e++"\n:t defaulted")
Run Code Online (Sandbox Code Playgroud)

(您可能希望将其放在您的.ghci文件中以始终使命令可用)然后

Prelude> :monotype (^)
defaulted :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

当然,实现单态限制的隐藏的全局副作用是非常难看的,但是哦......


She*_*rsh 3

从 GHC 8.4.1 开始,可以使用:type +d(或:t +d简称)选项来打印表达式的类型,如果可能的话,默认类型变量。

ghci> :t 42
42 :: Num p => p
ghci> :t +d 42
42 :: Integer
ghci> :t div
div :: Integral a => a -> a -> a
ghci> :t +d div
div :: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)