我一直在搜索谷歌一段时间,但无法找到答案:
假设我有多态的Tree ADT,基本有效负载总和类型和两种扩展和类型:
--Base.hs
data Tree a = Node a [Tree a] | Empty
data BasePayload = BaseA String | BaseB Int
--Extention1.hs
data Extention1 = Ext1A String String | Ext1B Int
--Extention2.hs
data Extention2 = B | A
我无法修改基类型,并且我不知道在编译时是否使用了多少扩展类型。是否可以创建像这样工作的函数:
--Base.hs
type GeneralTree = Tree SomeBoxType
transform :: Tree (SomeBoxType (any | BasePayload)) -> Tree (SomeBoxType any)
--Extention1.hs
transform :: Tree (SomeBoxType (any | Extention1)) -> Tree (SomeBoxType any)
--Extention2.hs
transform :: Tree (SomeBoxType (any | Extention2)) -> Tree (SomeBoxType any)
这样的事情可能吗?当我搜索时,我发现GADT,这不是我需要的,DataKinds和TypeFamilies,我不理解100%,但不认为这将有所帮助。这是行多态吗? 谢谢你的帮助。
答案 0 :(得分:0)
我怀疑你只想要一个Functor
个实例。因此:
instance Functor Tree where
fmap f (Node x children) = Node (f x) (fmap (fmap f) children)
fmap f Empty = Empty
现在可以为fmap
提供以下任何类型:
fmap :: (Either any BasePayload -> any) -> Tree (Either any BasePayload) -> Tree any
fmap :: (Either any Extention1 -> any) -> Tree (Either any Extention1 ) -> Tree any
fmap :: (Either any Extention2 -> any) -> Tree (Either any Extention2 ) -> Tree any
顺便说一句,我发现Empty
构造函数非常可疑。例如Node 0 []
和Node 0 [Empty]
之间的区别是什么? Node 0 [Empty, Empty]
是否具有明显的价值?考虑使用编译器附带的Data.Tree
,没有此问题,并且已经有Functor
个实例。