gpt4 book ai didi

function - 用于在代数数据类型之间转换的 Haskell 多态函数

转载 作者:行者123 更新时间:2023-12-04 09:40:19 26 4
gpt4 key购买 nike

我有两个 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

有任何想法吗?

最佳答案

这对于 TypeFamilies 来说非常自然.你定义一个类型级别的函数

type family Converted a
type instance Converted Ab = Cd
type instance Converted Cd = Ab

然后你的签名变成
foo :: a -> Converted a

如果您只是在摆弄类型,那么您已经完成了,但是由于您希望在值级别上有不同的行为(从 A 返回 C 等等),我们实际上需要将我们的案例分散到一个新的类型类:
class Convertable a where
foo :: a -> Converted a

instance Convertable Ab where
foo A = C
foo B = D

instance Convertable Cd where
foo C = A
foo D = B

( live demo)

最后,您可以考虑制作 Converted如果使用最近的 GHC,则为封闭类型的同义词系列,或者通过将实例移动到 Convertable 中使其“关联”。实例声明。

关于function - 用于在代数数据类型之间转换的 Haskell 多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25192250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com