【发布时间】:2016-09-26 18:15:08
【问题描述】:
我对何时应该使用高阶函数而不是使用函数引用感到困惑。
考虑以下:
引用外部函数:
(+++) :: 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
不同方法的优缺点是什么?
注意,我知道 Prelude zipWith - 这纯粹是为了说明
【问题讨论】:
-
如果您认为使用
(+++)以外的其他参数作为最后一个参数调用myFunction会有一些用处,那么作为参数传递是正确的做法。否则就没有意义了。 -
我不确定这些是否真的可以比较。这就像比较
\x y -> x + y和\x -> x + 7。第一个严格来说更笼统。第二个可能正是您在给定上下文中想要的。 -
如果您想避免指定该函数的具体实现并在使用时保留该函数,则需要将函数作为参数传递。好像你的函数不需要任何外部依赖传递函数是没有意义的。
-
我认为这主要是编码的美学/艺术方面——你的定义有多笼统?对我来说,有一个“感觉正确”的普遍水平——我会说尽可能笼统,然后再让事情变得更笼统变得难以忍受,因为要解决的问题变得难以忍受,其中可承受性也是一种感觉......跨度>
标签: haskell higher-order-functions