{-# 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]
答案 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