我想创建一个 pointfree 函数,它接受一系列函数,对每个列出的函数应用一个参数,然后通过另一个函数压缩列表。此函数的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
此实现不是无点,如何将此函数转换为无点表示?
答案 0 :(得分:3)
不是无点样式,但使用Applicative
(需要导入Control.Applicative
)肯定可以大大简化:
multiplex f xs e = f $ xs <*> pure e
invariantsHold
也可以简化一下:
invariantsHold = multiplex and [(>=0),(<=50),even]
使用sequenceA
(来自Data.Traversable
)是定义此multiplex
的另一种方式:
multiplex f xs e = f $ sequenceA xs e
这个定义可以用无点样式重写(由pointfree
给出):
multiplex = (. sequenceA) . (.)
或
multiplex = flip ((.) . (.)) sequenceA
漂亮,但对我来说似乎毫无意义: - )