当我使用高阶函数而非使用函数引用时,我感到很困惑。
考虑以下内容:
参考外部功能:
(+++) :: Int -> Int -> Int
(+++) a b = a + b
myFunction :: [Int] -> [Int] -> [Int]
myFunction (x : xs) (y : ys) = result : myFunction xs ys
where
result = x +++ y
将函数作为参数传递:
(+++) :: Int -> Int -> Int
(+++) a b = a + b
myFunction :: [Int] -> [Int] -> (Int -> Int -> Int) -> [Int]
myFunction (x : xs) (y : ys) func = result : myFunction xs ys
where
result = func x y
不同方法的优点/缺点是什么?
N.B.I我知道Prelude zipWith - 这纯粹是为了说明
答案 0 :(得分:1)
我认为默认情况下 ,您应该对所有函数调用进行硬编码。在此示例中,myFunction
应该只调用+++
。
但是,我知道此规则的三个例外:
请注意"未来代码"在第3点可能意味着您自己的代码(您打算下周添加另一个模块使用带有不同参数的参数版本,因此您今天已经添加了参数版本)或其他人的代码(您导出参数版本在库中,您猜测库的用户将要使用不同的参数调用参数版本。)
虽然第1点和第2点相当明确,但第3点需要对您未来的需求或其他人的需求进行大量猜测。因此,对于今天的代码应该准备多少以满足未来需求,存在着不同的思想流派。我想许多Haskell程序员在参数方面的结果更多了。