给定:
data TwoInts = TwoInts Int Int
add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b
有没有可能add'em
不用命名a
和写b
。就像是:
add'em TwoInts = (+) -- (Note: Fails to type check)
给定:
data TwoInts = TwoInts Int Int
add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b
有没有可能add'em
不用命名a
和写b
。就像是:
add'em TwoInts = (+) -- (Note: Fails to type check)
通过类比元组,
data TwoInts = TwoInts { fst', snd' :: Int }
我们可以定义一个操作,将两个参数的函数提升到一个TwoInt
uncurry' f p = f (fst' p) (snd' p)
给我们一个很好的符号:
add'em = uncurry' (+)
一般来说,我会说不,这是不可能的。但是,如果您试图解决到处拆包的实际问题(尤其常见于 newtypes),我通常会定义一个mapf f (Type val) = Type (f val)
函数,类似于 fmap,然后不导出它。只需传递更多函数,您就可以对 n 元数据类型执行相同的操作。如果实现不应该是秘密的,您也可以将其导出(作为一元的 fmap)。我推荐这种映射函数或复杂类型的视图,因为模式匹配会将您与实现联系起来。
基本类型已经定义了这样的功能,例如maybe
和either
。