繁体   English   中英

在Haskell中返回函数

[英]Returning a function in Haskell

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

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

但找不到任何可以实现此目的的功能。

是的,您可以,而且它在语言中是如此普遍和根深蒂固,以至您根本没有注意到它!

例如,当你写

mean :: Double -> Double -> Double
mean a b = (a + b) / 2

您真正要做的是定义一个函数

mean :: Double -> EndoDouble
mean a = meanA
 where meanA b = (a + b) / 2

其中的meanA类型meanA

type EndoDouble = Double -> Double

碰巧是一个函数类型。

因此,Haskell中的任何“多参数函数”实际上都是返回函数的单参数函数! 这个概念称为Currying ,您可能已经听说过。

是的,您可以:函数是Haskell中的值,因此它可以很简单

functionIdentity :: (a -> b) -> a -> b
functionIdentity f = f

...这只是一个专门的身份功能。

如果愿意,您也可以使用lambda“显式”返回函数,例如const

const x = \_ -> x

将函数视为一等公民是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM