Joh*_*ler 15 haskell pattern-matching pointfree
鉴于:
data TwoInts = TwoInts Int Int
add'em :: TwoInts -> Int
add'em (TwoInts a b) = a+b
Run Code Online (Sandbox Code Playgroud)
是否可以写add'em
而不必命名a
和b
.就像是:
add'em TwoInts = (+) -- (Note: Fails to type check)
Run Code Online (Sandbox Code Playgroud)
Don*_*art 12
通过对元组的类比,
data TwoInts = TwoInts { fst', snd' :: Int }
Run Code Online (Sandbox Code Playgroud)
我们可以定义一个操作来将两个参数的函数提升到一个 TwoInt
uncurry' f p = f (fst' p) (snd' p)
Run Code Online (Sandbox Code Playgroud)
给我们一个很好的符号:
add'em = uncurry' (+)
Run Code Online (Sandbox Code Playgroud)
一般来说,我会说不,这是不可能的.但是,如果你试图解决在整个地方展开和包装的实际问题(特别是对于newtypes),我经常定义一个mapf f (Type val) = Type (f val)
类似于fmap 的函数,然后不导出它.只需传递更多函数,就可以对n-ary数据类型执行相同的操作.如果实现不应该是秘密的,您也可以将其导出(作为一元的fmap).我建议使用这种映射函数或复杂类型的视图,因为模式匹配会将您绑定到实现.
基本类型已经定义了这样的功能,例如maybe
和either
.