高阶函数还是通过引用传递?
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
应该只调用 +++
.
但是,我知道这条规则有三个例外:
- 通过不对函数调用进行硬编码,您的代码会变得更加清晰。
- 您的代码多次使用不同参数的参数化版本。
- 您有理由相信,未来的代码将不止一次使用具有不同参数的参数化版本。
请注意,第 3 点中的 "future code" 可能表示您自己的代码(您计划下周添加另一个模块,该模块使用具有不同参数的参数版本,因此您今天已经添加了参数版本)或别人的代码(你在库中导出参数化版本,你猜想库的用户会想用不同的参数调用参数化版本)。
虽然第 1 点和第 2 点相当明确,但第 3 点需要对您未来的需求或其他人的需求进行大量猜测。因此,对于今天的代码应该准备多少以满足未来的需求,存在不同的思想流派。我猜很多 Haskell 程序员最终会更多地关注事物的参数方面。
我对什么时候应该使用高阶函数而不是使用函数引用感到困惑。
考虑以下:
引用外部函数:
(+++) :: 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
应该只调用 +++
.
但是,我知道这条规则有三个例外:
- 通过不对函数调用进行硬编码,您的代码会变得更加清晰。
- 您的代码多次使用不同参数的参数化版本。
- 您有理由相信,未来的代码将不止一次使用具有不同参数的参数化版本。
请注意,第 3 点中的 "future code" 可能表示您自己的代码(您计划下周添加另一个模块,该模块使用具有不同参数的参数版本,因此您今天已经添加了参数版本)或别人的代码(你在库中导出参数化版本,你猜想库的用户会想用不同的参数调用参数化版本)。
虽然第 1 点和第 2 点相当明确,但第 3 点需要对您未来的需求或其他人的需求进行大量猜测。因此,对于今天的代码应该准备多少以满足未来的需求,存在不同的思想流派。我猜很多 Haskell 程序员最终会更多地关注事物的参数方面。