【问题标题】:Prefix function as a predicate for filter function前缀函数作为过滤函数的谓词
【发布时间】:2015-10-07 14:00:32
【问题描述】:

这是来自 Learn You a Haskell for Great Good 的 filter 函数的类型签名和定义!:

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!"

返回:

"ell"

在这个特定的例子中,是否有可能使用elem 作为前缀函数而不是中缀函数作为谓词?

在更一般的意义上,有没有办法只提供第二个参数以部分应用前缀函数?

提前感谢您的帮助!

【问题讨论】:

    标签: haskell filter predicate prefix infix-notation


    【解决方案1】:

    通过创建一个 lambda(这将适用于采用 2 个以上参数的函数):

    filter' (\a -> elem a ['a'..'z']) "Hell0!"
    

    或者使用flip:

    filter' (flip elem ['a'..'z']) "Hell0!"
    

    【讨论】:

    • 值得一提:结果对所有人都是一样的:(`elem` v)、(\a -> elem a v) 和 (flip elem v)。另外,如果我没记错的话,你不需要美元符号。
    • @jd823592 我认为它的重点是提供一个等效的解决方案,所以我认为提及它并不重要。至于美元,我通常保留它是为了保持一致性和更容易区分“功能”和“数据”,尽管我确实意识到这是非常主观的。
    • 我并不是要暗示我不赞成。我完全同意你的回答,我只是认为这可能不是很明显,额外的信息可能会增进对此事的理解。
    • @bartek-banachewicz,这就是我要找的,非常感谢您的帮助!
    【解决方案2】:

    听起来你在寻找前奏曲中的flip :: (a -> b -> c) -> b -> a -> c。

    可以实现为flip f = \b a -> f a b。

    【讨论】:

    • @c-quilley,非常感谢您的回答,尽管我选择了@bartek-banachewicz 的提议作为最佳解决方案,因为它提出了两条不同的路径,flip 确实是我的正在寻找!
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    相关资源
    最近更新 更多