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

时间:2017-06-02 16:05:34

标签: haskell typeclass

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

以上作品,以下内容并非如此。似乎DefaultSignatures扩展只允许指定约束,但不能替换具体类型。 GHC用户指南Default Method Signatures部分没有解释这一点。为什么DefaultSignatures不允许我替换具体类型?理由是什么?在哪里可以阅读有关DefaultSignatures的实现方式和原因的更多信息?

{-# LANGUAGE DefaultSignatures #-}
class C a where
  f :: [a]
  default f :: [Int]
  f = [1,2,3,4,5]

1 个答案:

答案 0 :(得分: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]

而不是说f具有Int列表的类型,您需要说f具有某种类型a的列表类型,其中a 1}}是Int。需要{-# LANGUAGE TypeFamilies #-}语言扩展才能启用类型等式。这不是它的用途,但它是必需的。编译GHC 8.0.2