首页 > 解决方案 > 使用需要多个输入的过滤器 - Haskell

问题描述

我对 Haskell 比较陌生,过去几周一直在尝试学习它,但一直停留在过滤器和谓词上,我希望能在理解方面得到帮助。

我遇到了一个问题,我有一个元组列表。每个元组由一个(songName, songArtist, saleQty)和一个组成,需要根据用户输入的歌曲名称和歌曲艺术家从该列表中删除一个元组。

返回结果时,我知道我可以在返回结果时使用该Filter函数删除一个元组。我一直在使用 LYAH 进行一些阅读。它告诉我,我必须使用谓词(这是另一个函数)来过滤我的结果。这让我措手不及,因为我了解到一个Filter函数具有类型(a -> Bool) -> [a] -> [a],这意味着我的输入Filter需要是布尔值,而我的谓词输出需要是布尔值,以便可以将其提供给Filter.

这是一个问题,要从列表中过滤我的结果,我需要在递归遍历结果时将songName和songArtist(都是String类型)输入到谓词中,并将songName和songArtist输出Filter到让它知道需要从列表中删除哪个确切的元组。

我是以错误的方式解决这个问题还是有更好的方法可以解决这个问题?

标签: haskell

解决方案


我了解到过滤器函数有类型(a -> Bool) -> [a] -> [a]

filter :: (a -> Bool) -> [a] -> [a]接受两个参数,一个带有签名的谓词a -> Bool和一个项目列表,它返回一个满足该谓词的项目列表。所以谓词是第一个参数。

这意味着我的输入Filter需要是Boolean.

没有第一个参数有类型a -> Bool,所以它是一个将项目映射a到 a的函数Bool,所以是一个谓词

例如,您可以创建一个函数来检查songName和是否都songTitle匹配:

filterSales :: String -> String -> [(String, String, Int)] -> [(String, String, Int)]
filterSales artist title items = filter p items
    where p (artist', title', _) = artist == artist' && title == title'

p就是谓词,一个将 3 元组映射到布尔值的函数。如果前两项分别等于和,则谓词p将返回一个三元组。Trueartisttitle


推荐阅读