为什么mth4
的类型根据它是在文件中定义还是直接在GHCi repl中定义而不同?test2.hs
的内容:
mth1 x y z = x * y * z
mth2 x y = \z -> x * y * z
mth3 x = \y -> \z -> x * y * z
mth4 = \x -> \y -> \z -> x * y * z
字符串test2.hs
加载到GHCI repl中,mth4
的类型为:
mth4 :: Integer -> Integer -> Integer -> Integer
型
但是如果直接在GHCi repl中输入它们,那么mth4的类型是:
mth4 :: Num a => a -> a -> a -> a
型
将test2.hs
加载到GHCi repl中:
peti@DESKTOP-0I7S3RB:~/ws/haskell$ ghci test2.hs
GHCi, version 9.6.2: https://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/peti/.ghci
[1 of 2] Compiling Main ( test2.hs, interpreted )
Ok, one module loaded.
ghci> :t mth1
mth1 :: Num a => a -> a -> a -> a
ghci> :t mth2
mth2 :: Num a => a -> a -> a -> a
ghci> :t mth3
mth3 :: Num a => a -> a -> a -> a
ghci> :t mth4
mth4 :: Integer -> Integer -> Integer -> Integer
型
直接输入GHCi repl:
peti@DESKTOP-0I7S3RB:~/ws/haskell$ ghci
GHCi, version 9.6.2: https://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/peti/.ghci
ghci> mth1 x y z = x * y * z
ghci> mth2 x y = \z -> x * y * z
ghci> mth3 x = \y -> \z -> x * y * z
ghci> mth4 = \x -> \y -> \z -> x * y * z
ghci> :t mth1
mth1 :: Num a => a -> a -> a -> a
ghci> :t mth2
mth2 :: Num a => a -> a -> a -> a
ghci> :t mth3
mth3 :: Num a => a -> a -> a -> a
ghci> :t mth4
mth4 :: Num a => a -> a -> a -> a
ghci>
型
1条答案
按热度按时间ezykj2lf1#
这是因为monomorphism restriction在GHCi中默认关闭:
默认情况下,在编译的模块中打开该限制,并在GHCi提示符下关闭该限制(自GHC 7.8.1起)。您可以通过使用MonomorphismRestriction和NoMonomorphismRestriction语言杂注来覆盖这些默认值。
还有this post,它问这是什么。