在Haskell中返回一个函数

时间:2014-12-21 23:57:19

标签: haskell

在Haskell中,是否可以从函数中返回函数?我试着在Hoogle上搜索:

(a -> b) -> a -> b

但无法找到任何可以实现此功能的功能。

3 个答案:

答案 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