我有这个
data Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
Run Code Online (Sandbox Code Playgroud)
但MyClass不可导出.为什么?
sab*_*uma 13
GHC无法神奇地派生任意数据类型的实例.但是,它可以利用newtype声明为相同的基础类型创建新名称以便为使用该GeneralizedNewtypeDeriving扩展的用户派生实例
的事实.所以,你可以这样做:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype Something = Something Integer deriving (MyClass, Show)
class MyClass a where
hello :: MyClass a => a -> a
instance MyClass Integer where
hello i = i + 1
main = print . hello $ Something 3
Run Code Online (Sandbox Code Playgroud)
GHC无法派生新实例的原因是它不知道实例应该是什么.即使您的数据类型只有一个字段,它也可能不一定与该字段相同.为newtypes 派生实例的能力很方便,因为它们通常用于为某些类型类提供不同的行为,或者作为一种使用类型系统来分隔代码中具有相同类型但用途不同的事物的方法.
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |