如何写一个可派的类?

时间:2013-02-07 16:03:58

标签: haskell

我有这个

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不可导出。为什么?

2 个答案:

答案 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 您需要创建一个可以处理任意类型的泛型表示的类。我不认为你给出的具体例子对于可导出的类是合理的。