Transforming a function to point-free style changes its type

空扰寡人 提交于 2019-12-03 23:28:50

This is known as the monomorphism restriction.

Basically, it means that top-level bindings that look like x = are forced to be non-polymorphic, unless you specify a type signature. Bindings with arguments, i.e. f x = are not affected. See the link for details as to why this restriction exists.

Usually, you get an error message when the restriction is applied, but in this case GHCi is able to use type defaulting to change the type Num a => a to Integer.

The easiest way to dodge it is to either use an explicit type signature, or put

{-# LANGUAGE NoMonomorphismRestriction #-}

at the top of your module, or run GHCi with -XNoMonomorphismRestriction.

As others have pointed out, this is caused by something called the "Monomorphism Restriction".

MR can be useful for writers of Haskell compilers, and there is controversy about whether or not it is worthwhile to have in the language in general. But there is one thing everyone agrees: at the GHCi prompt, MR is nothing but a nuisance.

MR will probably be turned off by default in this context in an upcoming version of GHC. For now, you should disable it in GHCi by creating a text file called ".ghci" in your home directory that contains a line like this:

:set -XNoMonomorphismRestriction

Because the definition of g doesn't explicitly name its arguments, you run into the monomorphism restriction, preventing g from being polymorphic and (in this case) causing GHC to default to Integer.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!