我们可以解构任意数据构造函数吗?

时间:2017-02-14 08:44:47

标签: haskell functional-programming pattern-matching

在Haskell或支持模式匹配的任何其他编程语言中,我们可以实现以下目标:

给定一个数据构造函数,例如Left :: a -> Either a b我可以用

提取其参数
let f (Left x) = [x]

是否有任何方法可以为任何数据构造函数实现相同的功能,例如将*提升为Left xApply (λ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

1 个答案:

答案 0 :(得分:3)

不直接,主要是因为构造函数的参数通常是不同的类型。

您可以使用各种通用编程库实现类似的功能。例如,来自sybgfoldlgmapTgmapQ允许您统一操作子标记,并且在generics-sop中,您可以将构造函数的参数表示为异构列表。