高阶函数还是通过引用传递?

Higher Order Functions or pass by reference?

我对什么时候应该使用高阶函数而不是使用函数引用感到困惑。

考虑以下:

引用外部函数:

(+++) :: 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

不同方法有哪些pros/cons?

N.B.I 我知道 Prelude zipWith - 这纯粹是为了说明

我认为默认情况下,您应该对所有函数调用进行硬编码。在这个例子中,myFunction 应该只调用 +++.

但是,我知道这条规则有三个例外

  1. 通过不对函数调用进行硬编码,您的代码会变得更加清晰。
  2. 您的代码多次使用不同参数的参数化版本。
  3. 您有理由相信,未来的代码将不止一次使用具有不同参数的参数化版本。

请注意,第 3 点中的 "future code" 可能表示您自己的代码(您计划下周添加另一个模块,该模块使用具有不同参数的参数版本,因此您今天已经添加了参数版本)或别人的代码(你在库中导出参数化版本,你猜想库的用户会想用不同的参数调用参数化版本)。

虽然第 1 点和第 2 点相当明确,但第 3 点需要对您未来的需求或其他人的需求进行大量猜测。因此,对于今天的代码应该准备多少以满足未来的需求,存在不同的思想流派。我猜很多 Haskell 程序员最终会更多地关注事物的参数方面。