[Haskell电影搜索
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Haskell电影搜索相关的知识,希望对你有一定的参考价值。
我是Haskell的新手,我有一个项目,如果列表中满足两个条件,则需要给出True,我已经具有两个功能来检查分数是否高于或导演是否相同(我不是确实确定这是针对imdbAtLeast和Director功能的正确解决方案),但是现在我需要合并这两个条件,但是我被卡住了,不知道该怎么做。
对于该测试用例,功能必须归真:
和_(导演“ Brad Bird”)(imdbAtLeast 7.5)(“ Incredibles 2”,7.7,“ Brad Bird”)
and_(imdbAtLeast 7.5)(导演“ Brad Bird”)(“ Incredibles 2”,7.7,“ Brad Bird”)
不是(and_(导演“ Brad Bird”)(imdbAtLeast 7.9)(“ Incredibles 2”,7.7,“ Brad Bird”))
我的代码:
type Movie = (String, Double, String)
-- movies :: [(String, Double, String)]
movies :: [Movie]
movies = [ ("Green Book", 8.3, "Peter Farrelly")
, ("Inception", 8.8, "Christopher Nolan")
, ("Incredibles 2", 7.7, "Brad Bird")
, ("The Dark Knight", 9.0, "Christopher Nolan")
]
imdbAtLeast :: Double -> (String,Double,String) -> Bool
imdbAtLeast pointgive (_, point, _) = point >= pointgive
director :: String -> (String,Double,String) -> Bool
director directorgive (_, _, director) = director == directorgive
and_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ (_,directorgive) (_,pointgive) (title,point,actor) = point >= pointgive && director == directorgive
[我认为您正在尝试使过程过于复杂-您可以像这样简单地编写它:
and_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ p q m = p m && q m
我将做另外一些可选的注释,您可能会发现它们有用:
1]希望您会注意到,上述功能中的任何内容均不适用于您的Movie
类型。因此,您可以将签名替换为更通用的(a -> Bool) -> (a -> Bool) -> a -> Bool
-然后根据需要将其用于更多类型。
2]当您更多地了解Haskell,尤其是有关应用函子时,您将意识到,可以更简洁地将其写为and_ = (&&) <$> p <*> q
。现在不必担心太多,但是您会经常看到人们使用此惯用语来创建一个新函数,该函数应用另外两个函数并将结果与另一个函数/运算符组合在一起(在这种情况下为(&&)
) 。
以上是关于[Haskell电影搜索的主要内容,如果未能解决你的问题,请参考以下文章