Haskell中是否可以进行无点模式匹配?

Haskell中是否可以进行无点模式匹配?,haskell,pattern-matching,pointfree,Haskell,Pattern Matching,Pointfree,给定的: 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 } 我们可以定义一个操作,将两个参数的函数提升到T

给定的

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' (+)

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


基本类型已经定义了这样的函数,例如,
可能
或者

您甚至可以为可流通的东西创建一个类型类,因此它可以应用于两个以上的点…@mathepic,uncurry可以无点编写<代码>未修正=('ap'snd)。(.fst)。关键是要摆脱模式匹配,因为点更清晰,imho。我曾经听人说过Lisp(参考Lisp宏):你只需要写一次同样难看的代码。如果你认为有意义的代码是“丑陋”的,那么就写一个“丑陋”的提升函数,然后再重复使用它。作为Conor McBride,习语/应用程序也在这里帮助,<代码> uncuryf= f fST-SND ——而且比愚蠢的<>(<)>代码>版本要简单得多。fst snd,因为它打字更快。这里选择的Applicative实例有点像FORTH等基于堆栈的语言中的
DUP
。可能:是。智者:不一定。你为什么说一般来说是不可能的?您始终可以定义构造函数和解构器函数来替换显式模式匹配;你可以把一个有点的Haskell函数转换成一个(任意复杂的)无点版本。一般来说,这是可能的。只是术语方面的问题,我以为他在寻找一个不需要辅助函数的解决方案。即无点模式匹配。如果你定义了一个函数,那么它就是无点函数。破坏一个构造器最终总是归结为一个案例,对吗?我想你可以说,实际上,泛型编程的东西意味着你不必写一个case,只是因为编译器将一个case放在了自动数据实例中。
可能
都是类型的折叠(即使数据类型不是递归的,这可能就是为什么它们不被称为折叠的原因),因为它将该类型的对象转换为其Church编码:您为它提供一个对应于每个构造函数的函数。要构建返回值,对这些函数的调用将替换对数据类型构造函数的调用。您的
mapf
fmap
非常相似,但仅适用于具有1个构造函数和1个参数的类型;否则,与褶皱的类比更有用。