haskell 为什么一个函数的类型会根据它是在文件中定义的还是在GHCi repl中定义的而有所不同?

nwsw7zdq  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(144)

为什么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>

ezykj2lf

ezykj2lf1#

这是因为monomorphism restriction在GHCi中默认关闭:
默认情况下,在编译的模块中打开该限制,并在GHCi提示符下关闭该限制(自GHC 7.8.1起)。您可以通过使用MonomorphismRestriction和NoMonomorphismRestriction语言杂注来覆盖这些默认值。
还有this post,它问这是什么。

相关问题