在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带有两个参数,而其他两个函数仅带有一个...非常感谢帮助。
答案 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)