2017-02-14 92 views
2

在Haskell或任何其他支持模式匹配的编程语言中,我们可以实现以下功能:我们可以解构任意的数据构造函数吗?

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

let f (Left x) = [x] 

说法是有什么办法可以实现对任何数据构造同样的事情,像运营商(*)取消Left xApply (λa.Left a) [x]BinTree x yApply (λa,b.BinTree a b) [x,y],所以我们可以做

let extract x = case *x of Apply _ xs -> xs 
+1

那些不是_type_构造函数,它们是_value_构造函数,或者只是“构造函数”。类型构造函数是'Maybe,IO,IO,State,...',它们是'* - > * - > ....-> *'的东西。 – chi

+0

我认为这是一个答案,@ kosmikus。而且chi有一点:'Left'是一个值构造函数,而不是一个类型。 – Zeta

+0

@kosmikus是不是不推荐使用syb? – arrowd

回答

3

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

您可以使用各种通用编程库实现类似的功能。例如,gfoldl,gmapT,gmapQ from syb可让您对子条件进行统一操作,而在generics-sop中,您可以将构造函数的参数表示为异构列表。

相关问题