[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电影搜索的主要内容,如果未能解决你的问题,请参考以下文章

在 Haskell 中查找一棵树是不是是二叉搜索树

Atom 没有突出 Haskell 语法?

“无操作”haskell

巴洛克首饰哪家强?Miriam Haskell

在 Haskell 中使用 Logic Monad

将 Haskell 用于大型实时系统:如何(如果?)?