将函数转换为无点样式会更改其类型

Fra*_*ank 15 haskell types monomorphism-restriction

我正在开始Haskell ...我尝试用两种不同的方式编写以下简单的函数,让Haskell决定类型,类型系统在每种情况下都做了不同的事情.这种行为的解释是什么?

Prelude> let f x = 2 * x
Prelude> let g = (2*)
Prelude> :info f
f :: Num a => a -> a    -- Defined at <interactive>:1:5
Prelude> :info g
g :: Integer -> Integer     -- Defined at <interactive>:1:5
Run Code Online (Sandbox Code Playgroud)

谢谢!

ham*_*mar 12

这被称为单态限制.

基本上,它意味着看起来像的顶级绑定x =被强制为非多态,除非您指定类型签名.带参数的绑定,即f x =不受影响.有关此限制存在的原因,请参阅链接.

通常,在应用限制时会收到错误消息,但在这种情况下,GHCi可以使用类型默认将类型更改Num a => aInteger.

躲避它的最简单方法是使用显式类型签名,或者放置

{-# LANGUAGE NoMonomorphismRestriction #-}
Run Code Online (Sandbox Code Playgroud)

在模块的顶部,或运行GHCi -XNoMonomorphismRestriction.