[英]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.