【发布时间】:2014-04-19 17:56:21
【问题描述】:
我想创建一个 pointfree 函数,它采用函数列表,将单个参数应用于每个列出的函数,然后通过另一个函数压缩列表。此函数的无点版本将具有以下类型签名:
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
multiplex f xs e = f $ map ((flip ($)) e) xs
这个实现不是无点的,我怎样才能把这个函数转换成一个无点的表示?
【问题讨论】:
-
Lambdabot 暗示了这个美丽:
(. flip (map . flip id)) . (.) -
我知道;这就是为什么我没有将其发布为答案的原因。无论如何,
($ e)而不是((flip ($)) e)会大大提高可读性。 -
如果你交换了
[c -> a]和c那么它只是(.: map . flip ($))其中(.:) = (.) . (.) -
@jozefg 总是有:
((.: map . flip ($)) ^>) where (.:) = (.).(.); (^>) = flip . flip .(.) flip
标签: haskell haskell-platform pointfree purely-functional