作为F#的新手,我在理解“提升”一词时遇到了问题,我无法正确提升函数。
例如,我如何解除下面的功能以及它将如何影响功能行为。
let add item element = item :: element
任何帮助将不胜感激。
答案 0 :(得分:3)
请查看此页面http://fsharpforfunandprofit.com/posts/elevated-world/,其中最好的说明以图形方式表示了提升的想法。
该站点提供了许多宝贵的资料,可以帮助您特别理解F#和总体上理解函数式编程。
简单来说,提升的概念是指采用适用于简单类型的函数f
并创建适用于泛型类型的新版本liftedF
。我们如何做到这一点?我们将函数f
传递给另一个函数,它返回f
的“新的和改进的”版本。例如,您有一个简单的函数可以返回整数的平方:
let square x = x * x // val square : int -> int
简单吧?您传递了一个int
,它返回了另一个int
。
现在,我们可以像这样创建新版本:
let squareArray xA = Array.map square xA // val squareArray : int [] -> int []
哇! squareArray
可以对整个整数数组求平方,并且创建起来是如此容易!我要做的就是将square
传递给Array.map
。
查看签名square
是int -> int
,而squareArray
是int [] -> int []
。真令人振奋!
如果您查看Array.map
的签名是('a -> 'b) -> 'a [] -> 'b []
可以解释为从类型'a
到'b
接收一个函数和一个'a
s数组并返回一个'b
s数组。但它也可以解释为接收从'a
到'b
的函数,并将提升后的函数从'a[]
返回到'b[]
:
('a -> 'b) -> 'a [] -> 'b []
与('a -> 'b) -> ('a [] -> 'b [])
您可以将功能提升为任何通用类型。 什么是通用类型?它是一种具有另一种类型作为参数的类型,您可能已经知道许多通用类型:
List<'t>
(也表示为't list
)是通用的,因为您可以拥有List<int>
,List<string>
,List<int * string>
,{{1 }} ...
:Array<'t>
,Array<int>
,Array<string>
,Array<int * string>
...
:Option<'t>
,Option<int>
,Option<string>
,Option<int * string>
...
:Result<'t,'r>
,Result<int, string>
,Result<string, string>
您可以将函数提升为其他通用类型:
...
全部在函数签名中。我们可以从...获得一个功能
let squareOption xO = Option.map square xO // val squareOption : int option -> int option
let stringArray sL = Array.map string sL // val stringArray : int [] -> string []
并获得int -> int
函数List<int> -> List<int>
到int -> int
Option<int> -> Option<int>
到string -> float