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实现应用类型默认规则后将如何更改类型?
您可以通过启用单态限制然后将其绑定到新名称来执行此操作:
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)
当然,实现单态限制的隐藏的全局副作用是非常难看的,但是哦......
从 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)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |