将Haskell函数转换为无点表示

时间:2014-04-19 17:56:21

标签: haskell haskell-platform pointfree purely-functional

我想创建一个 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

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

1 个答案:

答案 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

漂亮,但对我来说似乎毫无意义: - )