我正在使用OpenUnion a
type from world-peace
库,我想写一个函数,如果可能的话,它将把一个联合转换成一个更窄的联合:
unionShrink :: Contains bs as => OpenUnion as -> Maybe (OpenUnion bs)
Contains bs as
类型类表示bs ⊂ as
。联合表示类型参数列表中的一个类型值,因此是Maybe
,这意味着第一个联合可能包含一个不在第二个(更窄的)联合中的类型值。
如何做到这一点?
我正在使用OpenUnion a
type from world-peace
库,我想写一个函数,如果可能的话,它将把一个联合转换成一个更窄的联合:
unionShrink :: Contains bs as => OpenUnion as -> Maybe (OpenUnion bs)
Contains bs as
类型类表示bs ⊂ as
。联合表示类型参数列表中的一个类型值,因此是Maybe
,这意味着第一个联合可能包含一个不在第二个(更窄的)联合中的类型值。
如何做到这一点?
1条答案
按热度按时间xesrikrc1#
我觉得应该有一个更简单的方法,我不是很自豪的名字,但这里有一个方法来做到这一点:
它适用于简单的单态例子:
但我怀疑当涉及到多态性时,它是否会工作得很好。