将接受两个参数的过滤器函数应用到在Haskell中接受一个参数的函数产生的列表

时间:2019-03-24 13:44:35

标签: haskell filter

在Haskell中,我定义了一个过滤器函数,该函数带有两个参数并返回一个布尔值,即

myFilter :: a -> b -> Bool

我定义了一个带有一个参数并返回列表的函数,即

myFunction :: a -> [b]

myFunction接受的参数与myFilter接受的第一个参数相同,并且myFunction输出的列表项与myFilter的第二个参数具有相同的类型,即

myFunction a = [b]
myFilter a b = Bool

我想定义另一个函数myFilteredFunction

myFilteredFunction :: a -> [b]

这需要一个参数a,即myFilter和myFunction,并返回[b]的子集,该子集仅包含满足myFilter谓词设置的项,即过滤出使用myFilter的myFunction。这似乎很简单,但是我却无法使它起作用(我是Haskell的新手)!

我尝试过的某些选项显然不起作用:

myFilteredFunction = myFilter . myFunction
myFilteredFunction' = filter myFilter . myFunction
myFilteredFunction'' = myFilter . (map myFunction)

我看到的问题是myFilter带有两个参数,而其他两个函数仅带有一个...非常感谢帮助。

1 个答案:

答案 0 :(得分:4)

您的问题不是100%清楚,但我想您可能是这个意思?

myFilteredFunction :: a -> [b]
myFilteredFunction a = filter (\b -> myFilter a b) (myFunction a)

也就是说,您应用myFunction来获取列表,然后根据myFilter在应用于原始元素和被测试元素时是否给出True进行过滤。

请注意,此处的filter中使用的功能可以使用部分应用程序进行简化:

myFilteredFunction a = filter (myFilter a) (myFunction a)