我们可以解构任意的数据构造函数吗?
问题描述:
在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]
,所以我们可以做
let extract x = case *x of Apply _ xs -> xs
答
不是直接的,主要是因为构造函数的参数通常是不同的类型。
您可以使用各种通用编程库实现类似的功能。例如,gfoldl
,gmapT
,gmapQ
from syb可让您对子条件进行统一操作,而在generics-sop中,您可以将构造函数的参数表示为异构列表。
那些不是_type_构造函数,它们是_value_构造函数,或者只是“构造函数”。类型构造函数是'Maybe,IO,IO,State,...',它们是'* - > * - > ....-> *'的东西。 – chi
我认为这是一个答案,@ kosmikus。而且chi有一点:'Left'是一个值构造函数,而不是一个类型。 – Zeta
@kosmikus是不是不推荐使用syb? – arrowd