在Haskell中,是否可以从函数中返回函数?我试着在Hoogle上搜索:
(a -> b) -> a -> b
但无法找到任何可以实现此功能的功能。
答案 0 :(得分:6)
是的,你可以,而且它在语言中如此普遍且根深蒂固,甚至没有注意到它!
例如,当你写
时mean :: Double -> Double -> Double
mean a b = (a + b) / 2
你真正在做的是,定义一个函数
mean :: Double -> EndoDouble
mean a = meanA
where meanA b = (a + b) / 2
其中meanA
的类型,
type EndoDouble = Double -> Double
恰好是一种函数类型。
因此,Haskell中的任何“多参数函数”实际上都是一个返回函数的单参数函数!这个概念叫做Currying,你可能听说过它。
答案 1 :(得分:3)
是的,您可以:函数是Haskell中的值,因此它可以像
一样简单functionIdentity :: (a -> b) -> a -> b
functionIdentity f = f
......这只是一个专门的身份功能。
你也可以明确地"如果你愿意,可以使用lambda返回一个函数,比如const
:
const x = \_ -> x
答案 2 :(得分:2)
将函数视为一等公民是Haskell的优势之一,不需要任何特殊语法。
例如,如果你想要一个能够使给定函数结果加倍的函数,你可以写:
doubleFunction f = (\x -> 2 * (f x))
当给定函数f时,doubleFunction等于将(f x)乘以2的函数。您可以使用函数组合来编写它:
doubleFunction f = (* 2) . f
甚至更短:
doubleFunction = ((* 2) .)
doubleFunction的类型为:
doubleFunction :: (Num a) => (a -> b) -> a -> b