2

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

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

这个实现不是无点的,我怎样才能把这个函数转换成无点表示?

4

1 回答 1

3

不是无点风格,但肯定可以通过使用Applicative(需要导入Control.Applicative)来显着简化:

multiplex f xs e = f $ xs <*> pure e

invariantsHold也可以简化一点:

invariantsHold = multiplex and [(>=0),(<=50),even]

使用sequenceA(from Data.Traversable) 是定义 this 的另一种方法multiplex

multiplex f xs e = f $ sequenceA xs e

这个定义可以用无点风格重写(由 给出pointfree):

multiplex = (. sequenceA) . (.)

或者

multiplex = flip ((.) . (.)) sequenceA

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

于 2014-04-19T18:32:48.333 回答