我有这个
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
但MyClass不可导出。为什么?
答案 0 :(得分: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
GHC无法派生新实例的原因是它不知道实例是什么
应该。即使您的数据类型只有一个字段,也可能不一定是
和那个领域一样。为newtype
s派生实例的能力很方便,因为它们
通常用于为某些类型类提供不同的行为或作为一种方式
使用类型系统来分隔代码中具有相同类型但用途不同的内容。
答案 1 :(得分:13)
您可能需要查看GHC documentation on Generic Programming 您需要创建一个可以处理任意类型的泛型表示的类。我不认为你给出的具体例子对于可导出的类是合理的。