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

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而不必命名ab.就像是:

 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)

  • @mathepic,uncurry可以写成免费的.`uncurry =('ap'snd).(.fst)`.关键是摆脱模式匹配. (8认同)
  • @mathepic它的点数更加清晰,imho.我曾经听过它说过Lisp(参考Lisp宏):你只需要编写一次相同类型的丑陋代码.如果你认为有点代码是"丑陋的",那么只需编写一个"丑陋"的提升函数,然后再重复使用它. (4认同)
  • 正如Conor McBride [指出](https://twitter.com/#!/pigworker/status/66797697436368896),成语/应用程序也在这里帮助,`uncurry f = f <$> fst <*> snd` - 和比傻的(.)`版本简单得多. (4认同)

Eva*_*rge 5

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

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