{-# 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)
如果您正在使用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,其中a为Int.{-# LANGUAGE TypeFamilies #-}需要语言扩展才能启用类型等式.这不是它的用途,但它是必需的.编译GHC 8.0.2
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |