在Haskell或支持模式匹配的任何其他编程语言中,我们可以实现以下目标:
给定一个数据构造函数,例如Left :: a -> Either a b
我可以用
let f (Left x) = [x]
是否有任何方法可以为任何数据构造函数实现相同的功能,例如将*
提升为Left x
或Apply (λa.Left a) [x]
至{{BinTree x y
的运算符(Apply (λa,b.BinTree a b) [x,y]
) 1}},所以我们可以做到
let extract x = case *x of Apply _ xs -> xs
答案 0 :(得分:3)
不直接,主要是因为构造函数的参数通常是不同的类型。
您可以使用各种通用编程库实现类似的功能。例如,来自syb的gfoldl
,gmapT
,gmapQ
允许您统一操作子标记,并且在generics-sop中,您可以将构造函数的参数表示为异构列表。