在Haskell中返回函数

在Haskell中返回函数,haskell,Haskell,在Haskell中,是否可以从函数中返回函数?我试着在Hoogle上搜索: (a -> b) -> a -> b 但是找不到任何可以实现此功能的函数。是的,您可以:函数是Haskell中的值,因此它可以像 functionIdentity :: (a -> b) -> a -> b functionIdentity f = f …这只是一个专门的身份功能 如果愿意,还可以使用lambda显式返回函数,如const: 是的,你可以,它是如此普遍和根深蒂固的语

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

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

但是找不到任何可以实现此功能的函数。

是的,您可以:函数是Haskell中的值,因此它可以像

functionIdentity :: (a -> b) -> a -> b
functionIdentity f = f
…这只是一个专门的身份功能

如果愿意,还可以使用lambda显式返回函数,如const:


是的,你可以,它是如此普遍和根深蒂固的语言,你甚至没有注意到它

例如,当你写

mean :: Double -> Double -> Double
mean a b = (a + b) / 2
你真正要做的是定义一个函数

mean :: Double -> EndoDouble
mean a = meanA
 where meanA b = (a + b) / 2
其中meanA的类型

恰好是一个函数类型


因此,Haskell中的任何多参数函数实际上都是返回函数的单参数函数!这个概念叫做Haskell,你可能听说过。

将函数视为一等公民是Haskell的优点之一,不需要任何特殊语法

例如,如果您想要一个函数,该函数将使给定函数的结果加倍,您可以编写:

doubleFunction f = (\x -> 2 * (f x))
当给定一个函数f时,doubleFunction等于一个将fx乘以2的函数。您可以使用函数组合编写它:

doubleFunction f = (* 2) . f
甚至更短:

doubleFunction = ((* 2) .)
doubleFunction的类型为:

doubleFunction :: (Num a) => (a -> b) -> a -> b

我不确定这种功能的存在与第一句中的问题有什么关系。无论如何,有一个具有这种签名的函数——身份函数,专门用于类型a->b,因为a->b->a->b与a->b->a->b相同……也称为$。
doubleFunction = ((* 2) .)
doubleFunction :: (Num a) => (a -> b) -> a -> b