将布尔函数列表应用于Haskell中的两个参数
我有一个类型为将布尔函数列表应用于Haskell中的两个参数,haskell,monoids,Haskell,Monoids,我有一个类型为a->b->Bool的函数列表,我试图将它们应用于两个输入,并将结果与All或Any组合。我使用的是一个变量的函数: mconcat (map (All . ) [(<7),(>7),(==7)]) $ 6 mconcat(map(All.)[(7),(==7)])$6 但我不知道如何用两个变量函数做同样的事情 这项工作: mconcat (map (All . ) (map (uncurry) [(<),(>),(==)])) $ (,) 6 7 m
a->b->Bool
的函数列表,我试图将它们应用于两个输入,并将结果与All
或Any
组合。我使用的是一个变量的函数:
mconcat (map (All . ) [(<7),(>7),(==7)]) $ 6
mconcat(map(All.)[(7),(==7)])$6
但我不知道如何用两个变量函数做同样的事情
这项工作:
mconcat (map (All . ) (map (uncurry) [(<),(>),(==)])) $ (,) 6 7
mconcat(map(All.)(map(uncurry)[(),(==)]))$(,)6 7
但在我看来,这是一个丑陋的解决办法
有更好的方法吗?这是一种自行编写的代码,您只需将类型连接起来即可。但是有两个标准工具(即
Applicative
和Traversable
)可以用来缩短代码
在模块生命中sequenceA::(可遍历的t,应用的f)=>t(fa)->f(ta)
。当专门研究[]
的可遍历的实例和函数applicative(>)r
时,我们得到:
sequenceA :: [r -> a] -> r -> [a]
因此,sequenceA
将->
从[]
中拉出,将列表中的每个函数应用于一个固定参数
sequenceA [(< 7), (> 7), (== 7)] :: (Num n, Ord n) => n -> [Bool]
-- equivalent to:
\n -> map ($ n) [(< 7), (> 7), (== 7)]
(注意,对于任何正确实现的Ord
、
和实例,这是一种代码本身编写的类型-您只需将类型连接起来即可。但是,有两个标准工具(即Applicative
和Traversable
)可用于缩短代码
在模块中,sequenceA::(可遍历的t,应用的f)=>t(fa)->f(ta)
。当专门研究[]
的可遍历的实例和函数Applicative(>)r
时,我们得到:
sequenceA :: [r -> a] -> r -> [a]
因此,sequenceA
将->
从[]
中拉出,将列表中的每个函数应用于一个固定参数
sequenceA [(< 7), (> 7), (== 7)] :: (Num n, Ord n) => n -> [Bool]
-- equivalent to:
\n -> map ($ n) [(< 7), (> 7), (== 7)]
(注意,对于任何正确实施的Ord
,
和原始代码的替代方案:
mconcat (map (\f a b -> All (f a b)) [(<),(<=)]) 3 4
与原始代码相近的替代方案:
mconcat (map (\f a b -> All (f a b)) [(<),(<=)]) 3 4