我有两个Haskell函数,用于在两个代数数据类型之间进行转换。
data Ab = A | B
data Cd = C | D
fromAb :: Ab -> Cd
fromAb A = C
fromAb B = D
toAb :: Cd -> Ab
toAb C = A
toAb D = B
但我希望创建一个多态函数,它可以接受代数数据类型并在它们之间进行转换。
foo A = C
foo B = D
foo C = A
foo D = B
但 Haskell 会推断出 "foo A = C" 这个函数是什么意思。
foo :: Ab -> Cd
我试图将数据类型实例化为一个类,使得foo具有多态性,但是并未成功。
class Abcd a
instance Abcd Ab
instance Abcd Cd
foo :: Abcd a => a -> Ab
有什么建议吗?
class Iso a b | a->b
,这将是此问题的传统方法(在类型族之前)。 - jberrymana -> b
(相当于 TypeFamilies)或者a -> b, b -> a
。如写成to A
可能会有歧义。 - jberrymandata Ef
,那么我们可以通过声明适当的实例来使用to
在3种类型之间任意转换。然而,如果我们使用fundep,这将变得不可能,但如果我们不需要这种灵活性,则可以获得更简单的类型推断。 - Mark Whitfield