是否可以在Haskell中创建一个在一组类型上运行的函数?

时间:2017-07-28 10:31:12

标签: haskell abstract-data-type

我一直在搜索谷歌一段时间,但无法找到答案:

假设我有多态的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%,但不认为这将有所帮助。这是行多态吗? 谢谢你的帮助。

1 个答案:

答案 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个实例。