Haskell能否显示多态类型的对象?

Haskell能否显示多态类型的对象?,haskell,types,polymorphism,Haskell,Types,Polymorphism,在《哈斯克尔通往逻辑、数学和编程之路》一书的第152页中,有人指出 然而,当我在ghc中键入[]时,我得到[]和 所以Haskell确实显示了多态数据类型,那么我是在这里遗漏了什么,还是这本书遗漏了什么 也许是后来添加到Haskell中的东西;这本书是2004年写的。这是将类多态表达式转换为单态表达式的默认过程的结果,如果它只需要在单个类型上使用。您的书中可能有一个关于默认的部分,当然这里不会介绍ghci的额外默认规则。使用扩展默认值,多态类型Show a=>[a]在打印前默认为单态类型[]。通

在《哈斯克尔通往逻辑、数学和编程之路》一书的第152页中,有人指出

然而,当我在ghc中键入[]时,我得到[]和

所以Haskell确实显示了多态数据类型,那么我是在这里遗漏了什么,还是这本书遗漏了什么


也许是后来添加到Haskell中的东西;这本书是2004年写的。

这是将类多态表达式转换为单态表达式的默认过程的结果,如果它只需要在单个类型上使用。您的书中可能有一个关于默认的部分,当然这里不会介绍ghci的额外默认规则。使用扩展默认值,多态类型Show a=>[a]在打印前默认为单态类型[]。通过禁用扩展默认设置,您可以很好地重现该书的错误,也可以重现类似的错误:

> :set -XNoExtendedDefaultRules
> []
<interactive>:2:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In a stmt of an interactive GHCi command: print it

这是默认将类多态表达式转换为单态表达式的过程的结果,如果它只需要在单个type plus上使用。您的书中可能有一个关于默认的部分,当然这里不会介绍ghci的额外默认规则。使用扩展默认值,多态类型Show a=>[a]在打印前默认为单态类型[]。通过禁用扩展默认设置,您可以很好地重现该书的错误,也可以重现类似的错误:

> :set -XNoExtendedDefaultRules
> []
<interactive>:2:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instances exist:
        instance Show Ordering -- Defined in ‘GHC.Show’
        instance Show Integer -- Defined in ‘GHC.Show’
        instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    • In a stmt of an interactive GHCi command: print it

否,它不显示对象,而是显示表达式。例如,如果您要查询:t head[1],它将不会写入1::Num a=>a,而是写入head[1]::Num a=>a。因此,它基本上复制了您编写的表达式。此外,ghci进行了一些ghc没有完成的类型默认设置。Haskell是语言;它不显示任何内容,GHCi显示。但这本书使用了拥抱。在WinHugs提示符中键入[]时,得到的错误与您复制的页面上显示的错误完全相同。但是tail[[1]]、[]]、[[]]或tail[[]]、[]]、[]]、[[[]]等都有效。@WillNess对不恰当的术语表示抱歉;我从数学中知道,当一些非数学家试图问一个问题时,这是多么烦人。唯一的问题是它是否妨碍了你的理解。在这里,你会问,这本书使用了什么实现?不,它不显示对象,它显示表达式。例如,如果您要查询:t head[1],它将不会写入1::Num a=>a,而是写入head[1]::Num a=>a。因此,它基本上复制了您编写的表达式。此外,ghci进行了一些ghc没有完成的类型默认设置。Haskell是语言;它不显示任何内容,GHCi显示。但这本书使用了拥抱。在WinHugs提示符中键入[]时,得到的错误与您复制的页面上显示的错误完全相同。但是tail[[1]]、[]]、[[]]或tail[[]]、[]]、[]]、[[[]]等都有效。@WillNess对不恰当的术语表示抱歉;我从数学中知道,当一些非数学家试图问一个问题时,这是多么烦人。唯一的问题是它是否妨碍了你的理解。在这里,你会问,这本书使用了什么实现?