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

Bab*_*san 12 haskell types

import Data.List (genericLength)

len = genericLength

:t genericLength
genericLength :: (Num i) => [b] -> i
:t len
len :: [b] -> Integer
Run Code Online (Sandbox Code Playgroud)

为什么类型len不同genericLength?这里的目的是使用更短的别名genericLength.

haskell中的功能不是一流的吗?不应该为功能结果赋予相同功能的其他名称吗?

C. *_*ann 12

你在这里看到的是因为要求没有参数的顶级声明是单态的.您可以在Haskell维基上找到有关此原因的讨论,以及有关在GHC用户指南中控制此行为的一些信息.

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

len x = genericLength x

> :t len
len :: Num i => [b] -> i
Run Code Online (Sandbox Code Playgroud)

给它一个类型签名也是如此:

len :: (Num b) => [a] -> b
len = genericLength
Run Code Online (Sandbox Code Playgroud)

关闭单态限制也是如此:

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

len = genericLength

> :t len
len :: Num i => [b] -> i
Run Code Online (Sandbox Code Playgroud)

在这个特定的情况下,我认为你也得到了一个不同的类型(而不是编译器错误),因为默认规则指定某些类型类应该默认为特定类型(在这种情况下,Num默认为Integer.如果你尝试这样做同样的事情fmap你得到这个:

> :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.
Run Code Online (Sandbox Code Playgroud)

您可以在Haskell 98报告中找到有关默认的一些信息.我还要提到GHC支持一种扩展形式的默认,它主要用于GHCi(默认情况下会在那里启用),这偶尔会让人感到困惑.

  • @ gorlum0:哈哈哈哈,单态和默认肯定会使这个功能*特别*无益. (2认同)