高阶函数参数
Higher order function parameter
and_ 函数有问题
"error: Parse error in pattern: 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_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ (f1 param1) (f2 param2) (_, rank, dir)
| f1 == director = (f1 param1 dir) && (f2 param2 rank)
| otherwise = (f1 param1 rank) && (f2 param2 dir)
这里是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")
您对 and_
的调用没有直接看到 director
和 "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
已经 "know" 他们正在检查 Movie
参数的哪一部分。
and_ 函数有问题
"error: Parse error in pattern: 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_ :: (Movie -> Bool) -> (Movie -> Bool) -> Movie -> Bool
and_ (f1 param1) (f2 param2) (_, rank, dir)
| f1 == director = (f1 param1 dir) && (f2 param2 rank)
| otherwise = (f1 param1 rank) && (f2 param2 dir)
这里是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")
您对 and_
的调用没有直接看到 director
和 "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
已经 "know" 他们正在检查 Movie
参数的哪一部分。