为什么DefaultSignatures不允许具体类型?

Mir*_*lov 6 haskell typeclass

{-# LANGUAGE DefaultSignatures #-}
class C a where
  f :: [a]
  default f :: (Num a) => [a]
  f = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

以上作品,下面没有.似乎DefaultSignatures扩展只允许指定约束,但不能替换具体类型.第默认方法签名中的GHC用户指南没有解释这一点.为什么DefaultSignatures不允许我替换具体类型?理由是什么?在哪里可以阅读有关DefaultSignatures的实现方式和原因的更多信息?

{-# LANGUAGE DefaultSignatures #-}
class C a where
  f :: [a]
  default f :: [Int]
  f = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

She*_*rsh 7

如果您正在使用GHC 8.0.2,那么您应该以不同的方式编写它,因为这些类型的类型检查器回归.见注释:

https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/8.0.2-notes.html

所以你需要像这样写:

{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE TypeFamilies #-}

class C a where
  f :: [a]
  default f :: (a ~ Int) => [a]
  f = [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

与其说中f有列表的类型IntS,你需要说,是f有一些类型的列表类型a,其中aInt.{-# LANGUAGE TypeFamilies #-}需要语言扩展才能启用类型等式.这不是它的用途,但它是必需的.编译GHC 8.0.2