Haskell中可能的无点模式匹配?

时间:2011-05-06 19:33:36

标签: haskell pattern-matching pointfree

鉴于

data TwoInts = TwoInts Int Int 

add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b

是否可以在不必命名add'ema的情况下撰写b。类似的东西:

 add'em TwoInts = (+) -- (Note: Fails to type check)

2 个答案:

答案 0 :(得分:12)

通过对元组的类比,

data TwoInts = TwoInts { fst', snd' :: Int }

我们可以定义一个操作,将两个参数的函数提升到TwoInt

uncurry' f p =  f (fst' p) (snd' p)

给我们一个好的表示法:

add'em = uncurry' (+)

答案 1 :(得分:5)

总的来说,我会说不,这是不可能的。但是,如果你试图解决在整个地方展开和包装的实际问题(特别是对于newtypes),我经常定义一个类似于fmap的mapf f (Type val) = Type (f val)函数,然后不导出它。只需传递更多函数,就可以对n-ary数据类型执行相同的操作。如果实现不应该是秘密的,您也可以将其导出(作为一元的fmap)。我建议使用这种映射函数或复杂类型的视图,因为模式匹配会将您绑定到实现。

基本类型已经定义了这样的功能,例如: maybeeither

相关问题