将Haskell函数转换为无点表示

将Haskell函数转换为无点表示,haskell,haskell-platform,pointfree,purely-functional,Haskell,Haskell Platform,Pointfree,Purely Functional,我想创建一个无点函数,它接受函数列表,对每个列出的函数应用一个参数,然后通过另一个函数压缩列表。此函数的无点版本将具有以下类型签名: multiplex::([a]->b)->[(c->a)]->(c->b) 以及一个示例用法: invariantsHold :: (Integral a) => a -> Bool invariantsHold = multiplex (all id) [(>=0),(<=50),even] 此实现不是无点的,如何将此函数转换为无点表示

我想创建一个无点函数,它接受函数列表,对每个列出的函数应用一个参数,然后通过另一个函数压缩列表。此函数的无点版本将具有以下类型签名:

multiplex::([a]->b)->[(c->a)]->(c->b)

以及一个示例用法:

invariantsHold :: (Integral a) => a -> Bool
invariantsHold = multiplex (all id) [(>=0),(<=50),even]

此实现不是无点的,如何将此函数转换为无点表示?

不是无点样式,但使用
Applicative
(需要导入
控件。Applicative
)肯定可以大大简化:


使用
sequenceA
(来自
Data.Traversable
)是定义此
多路复用的另一种方法:

multiplex f xs e = f $ sequenceA xs e
此定义可以用无点样式重写(由给出):


美丽,但对我来说似乎毫无意义:-)

建议这种美丽:
(.flip(map.flip id))。(.)
@duplode我在寻找一个有文档记录的函数转换,比如or。目标是尝试使函数更具可读性,同时减少定义中的点。Lambdabot的“美”虽然正确,但并没有给我提供改善功能所需的信息;这就是为什么我没有把它作为一个答案。在任何情况下,
($e)
而不是
((翻转($)e)
都会大大提高可读性。如果将
[c->a]
c
交换,那么它只是
(:map.flip($)
其中
(.:)=()。(。
@jozefg始终存在:
(:map.flip($)^>)其中(.:)=(.);(^>)=翻转。翻转。(.)翻转
multiplex f xs e = f $ xs <*> pure e
invariantsHold = multiplex and [(>=0),(<=50),even]
multiplex f xs e = f $ sequenceA xs e
multiplex = (. sequenceA) . (.)
multiplex = flip ((.) . (.)) sequenceA