Haskell 高阶函数参数

Haskell 高阶函数参数,haskell,functional-programming,higher-order-functions,parse-error,Haskell,Functional Programming,Higher Order Functions,Parse Error,与函数有关的问题 and_ (director "Brad Bird") (imdbAtLeast 7.5) ("Incredibles 2", 7.7, "Brad Bird") and_ (imdbAtLeast 7.5) (director "Brad Bird") ("Incredibles 2", 7.7, "Brad Bird") 错误:模式f1中的分析错误 type Movie = (String, Double, String) -- movies :: [(Stri

与函数有关的问题

and_ (director "Brad Bird") (imdbAtLeast 7.5) ("Incredibles 2", 7.7, "Brad 
Bird")
and_ (imdbAtLeast 7.5) (director "Brad Bird")  ("Incredibles 2", 7.7, "Brad 
Bird")
错误:模式f1中的分析错误

 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 -> Movie -> Bool
imdbAtLeast minRank (_, rank, _)
  | rank < minRank = False
  | otherwise      = True

director :: String -> Movie -> Bool
director expDir (_, _, dir)
  | expDir == dir = True
  | otherwise     = False
下面是对and函数的两个测试

and_ (director "Brad Bird") (imdbAtLeast 7.5) ("Incredibles 2", 7.7, "Brad 
Bird")
and_ (imdbAtLeast 7.5) (director "Brad Bird")  ("Incredibles 2", 7.7, "Brad 
Bird")
你打电话给导演和布拉德·伯德,但没有直接与他们见面;它获得了将director应用于Brad Bird和第二个参数后得到的函数

and_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ f1 f2 (_, rank, dir) | ...
更大的问题是你不能比较函数是否相等。即使假设director本身作为一个不同的参数传递,您也无法检查它是否与director引用的函数相同

您只需将前两个函数分别应用于第三个函数,并对结果使用&&即可:

and_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ f1 f2 m = f1 m && f2 m

f1和f2已经知道他们检查的是电影参数的哪一部分。

您能澄清一下and函数的意图吗?当且仅当传递给它的两个函数在应用于第三个参数时都返回True时,它是否像您希望它返回True那样简单?如果是这样的话,那就简单了,f g m=f m&&g请注意,您也可以使用函数的应用程序实例简单地编写这个函数。@RobinZigmond:这是我最喜欢的小实用程序之一,一元定义为x y=x>=\case True->y;False->pure False使其短路效果同上