前缀函数作为过滤函数的谓词
Prefix function as a predicate for filter function
这是类型签名和 filter
函数的定义,来自 Learn You a Haskell for Great Good!:
filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
书中的一个用法例子是elem
如下:
filter' (`elem` ['a'..'z']) "Hell0!"
哪个returns:
"ell"
在这个特定的例子中,是否有可能使用 elem
作为前缀函数而不是中缀函数作为谓词?
在更一般的意义上,有没有办法只提供第二个参数来部分应用前缀函数?
在此先感谢您的帮助!
要么通过创建一个 lambda(这将适用于采用 2 个以上参数的函数):
filter' (\a -> elem a ['a'..'z']) "Hell0!"
或使用 flip
:
filter' (flip elem ['a'..'z']) "Hell0!"
听起来你在 flip :: (a -> b -> c) -> b -> a -> c
之后,这是前奏。
可以实现为flip f = \b a -> f a b
。
这是类型签名和 filter
函数的定义,来自 Learn You a Haskell for Great Good!:
filter' :: (a -> Bool) -> [a] -> [a]
filter' _ [] = []
filter' p (x:xs)
| p x = x : filter' p xs
| otherwise = filter' p xs
书中的一个用法例子是elem
如下:
filter' (`elem` ['a'..'z']) "Hell0!"
哪个returns:
"ell"
在这个特定的例子中,是否有可能使用 elem
作为前缀函数而不是中缀函数作为谓词?
在更一般的意义上,有没有办法只提供第二个参数来部分应用前缀函数?
在此先感谢您的帮助!
要么通过创建一个 lambda(这将适用于采用 2 个以上参数的函数):
filter' (\a -> elem a ['a'..'z']) "Hell0!"
或使用 flip
:
filter' (flip elem ['a'..'z']) "Hell0!"
听起来你在 flip :: (a -> b -> c) -> b -> a -> c
之后,这是前奏。
可以实现为flip f = \b a -> f a b
。