高阶函数或通过引用传递?

时间:2016-09-26 18:15:08

标签: haskell higher-order-functions

当我使用高阶函数而非使用函数引用时,我感到很困惑。

考虑以下内容:

参考外部功能:

(+++) :: 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 - 这纯粹是为了说明

1 个答案:

答案 0 :(得分:1)

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

但是,我知道此规则的三个例外

  1. 通过不对函数调用进行硬编码,您的代码变得更加清晰。
  2. 您的代码使用不同参数的参数版本多次。
  3. 您有理由相信未来的代码将使用不同参数的参数版本多次使用。
  4. 请注意"未来代码"在第3点可能意味着您自己的代码(您打算下周添加另一个模块使用带有不同参数的参数版本,因此您今天已经添加了参数版本)或其他人的代码(您导出参数版本在库中,您猜测库的用户将要使用不同的参数调用参数版本。)

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

相关问题