Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 函数名的别名具有不同的类型签名。为什么?_Haskell_Types - Fatal编程技术网

Haskell 函数名的别名具有不同的类型签名。为什么?

Haskell 函数名的别名具有不同的类型签名。为什么?,haskell,types,Haskell,Types,为什么len的类型与genericlelength的类型不同?此处的目的是为genericLength使用较短的别名 哈斯克尔的函数不是一流的吗?给函数起另一个名字不应该导致一个相同的函数吗?您在这里看到的是因为要求没有参数的顶级声明是单态的。您可以在GHC用户指南中找到,以及有关的一些信息 如图所示,请注意,给出len参数可以解决问题: import Data.List (genericLength) len = genericLength :t genericLength generic

为什么
len
的类型与
genericlelength
的类型不同?此处的目的是为
genericLength
使用较短的别名


哈斯克尔的函数不是一流的吗?给函数起另一个名字不应该导致一个相同的函数吗?

您在这里看到的是因为要求没有参数的顶级声明是单态的。您可以在GHC用户指南中找到,以及有关的一些信息

如图所示,请注意,给出
len
参数可以解决问题:

import Data.List (genericLength)

len = genericLength

:t genericLength
genericLength :: (Num i) => [b] -> i
:t len
len :: [b] -> Integer
给它一个类型签名也是如此:

len x = genericLength x

> :t len
len :: Num i => [b] -> i
关闭单态限制也是如此:

len :: (Num b) => [a] -> b
len = genericLength
在这种特定情况下,我认为您也得到了不同的类型(而不是编译器错误),因为默认规则指定某些类型类应默认为特定类型(在这种情况下,
Num
默认为
Integer

{-# LANGUAGE NoMonomorphismRestriction #-}
import Data.List (genericLength)

len = genericLength

> :t len
len :: Num i => [b] -> i

您可以在中找到有关默认设置的一些信息。我还将提到GHC支持一种扩展的默认设置形式,它主要用于GHCi(默认情况下在那里启用),这有时会让人们感到困惑。

我对这方面的了解还不够,无法给出答案,但我很确定这和。如果你把
{-#语言nomonomogomism restriction}
在文件顶部,它将按照您期望的方式运行。+1感谢Jeffrey说它与单态限制有关。@gorlum0:Hahahaha,单态和默认肯定会使该功能变得特别无用。请注意,从GHC 7.8开始,这种情况不应该再发生了“单态限制现在在GHCi中默认关闭。”()
> :r
[1 of 1] Compiling Main             ( MonoTest.hs, interpreted )

MonoTest.hs:4:5:
    Ambiguous type variable `f0' in the constraint:
      (Functor f0) arising from a use of `fmap'
    Possible cause: the monomorphism restriction applied to the following:
      f :: forall a b. (a -> b) -> f0 a -> f0 b
        (bound at MonoTest.hs:4:1)
    Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
    In the expression: fmap
    In an equation for `f': f = fmap
Failed, modules loaded: none.