Haskell 使用转换函数使某物成为类型类的实例

Haskell 使用转换函数使某物成为类型类的实例,haskell,typeclass,Haskell,Typeclass,假设我有: data MyType myToDouble :: MyType -> Double 假设我希望MyType是Num或Real的实例,或者Double已经是的实例 有没有一种简单的方法可以实现这一点,而不必手动在Num/Real中为它写出所有的方法 所以。。。有没有什么方法可以说: instance Real MyType by way of myToDouble 绝对不是Real依赖于Num,并且Num具有返回a的方法(或者更准确地说,在a中是协变的)。您将如何实施: (

假设我有:

data MyType
myToDouble :: MyType -> Double
假设我希望MyType是Num或Real的实例,或者Double已经是的实例

有没有一种简单的方法可以实现这一点,而不必手动在Num/Real中为它写出所有的方法

所以。。。有没有什么方法可以说:

instance Real MyType by way of myToDouble

绝对不是
Real
依赖于
Num
,并且
Num
具有返回
a
的方法(或者更准确地说,在
a
中是协变的)。您将如何实施:

(+) :: MyType -> MyType -> MyType
只给出了
MyType
myToDouble

现在,您可能已经有了所有其他实例,只是想知道
Real
。嗯,
Real
的唯一方法是它自己的
torional
,因此:

instance Real MyType where
    toRational = toRational . myToDouble
至于你更一般的问题:不幸的是没有。如果在类型变量中有一个类,其方法都是逆变的(仅作为参数),那么您应该能够在这样的投影上自动定义一个typeclass。但哈斯克尔没有这样做的机制。(您可以使用模板Haskell自己编写一个)

您可以使用
GeneralizedNewtypeDeriving
将新类型的实例“转发”到其基础类型。例如

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype MyType = MyType Double
    deriving (Eq,Ord,Show,Num,Real)

但是你不能使用任何旧的同构。真遗憾。

绝对不是
Real
依赖于
Num
,并且
Num
具有返回
a
的方法(或者更准确地说,在
a
中是协变的)。您将如何实施:

(+) :: MyType -> MyType -> MyType
只给出了
MyType
myToDouble

现在,您可能已经有了所有其他实例,只是想知道
Real
。嗯,
Real
的唯一方法是它自己的
torional
,因此:

instance Real MyType where
    toRational = toRational . myToDouble
至于你更一般的问题:不幸的是没有。如果在类型变量中有一个类,其方法都是逆变的(仅作为参数),那么您应该能够在这样的投影上自动定义一个typeclass。但哈斯克尔没有这样做的机制。(您可以使用模板Haskell自己编写一个)

您可以使用
GeneralizedNewtypeDeriving
将新类型的实例“转发”到其基础类型。例如

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype MyType = MyType Double
    deriving (Eq,Ord,Show,Num,Real)
但是你不能使用任何旧的同构。真遗憾