Tar*_*tar 1 f# functional-programming function lifting
作为 F# 新手,我在理解术语“提升”时遇到问题,并且无法正确提升功能。
例如,我如何解除以下功能以及它将如何影响功能行为。
let add item element = item :: element
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。
看看这个页面http://fsharpforfunandprofit.com/posts/elevated-world/它有最好的解释和提升的想法的图形表示。
该站点是理解 F# 和一般函数式编程的好材料的宝库。
简单来说,提升的想法是指采用一个f适用于简单类型的函数并创建一个liftedF适用于泛型类型的新版本。我们如何做到这一点?我们把这个函数f传递给另一个函数,它返回一个“新的和改进的”版本的f. 例如,假设您有一个返回整数平方的简单函数:
let square x = x * x // val square : int -> int
Run Code Online (Sandbox Code Playgroud)
简单吧?你传递一个int,它返回另一个int。
现在让我们创建一个这样的新版本:
let squareArray xA = Array.map square xA // val squareArray : int [] -> int []
Run Code Online (Sandbox Code Playgroud)
哇!squareArray可以对整个整数数组进行平方,而且很容易创建!我需要做的就是传递square给Array.map.
查看签名squareisint -> int和squareArrayis int [] -> int []。那就是提升!
如果查看Array.mapis的签名('a -> 'b) -> 'a [] -> 'b []
,可以将其解释为从'ato类型接收一个函数'b和一个'as数组并返回一个'bs数组。但它也可以被解释为从接收功能'a,以'b“和返回功能提升'a[]到'b[]:
('a -> 'b) -> 'a [] -> 'b [] 是相同的('a -> 'b) -> ('a [] -> 'b [])您可以将函数提升为任何泛型类型。什么是泛型类型?它是一种具有另一种类型作为参数的类型,您可能已经知道许多泛型类型:
List<'t>(也表示为't list)是通用的,因为您可以拥有不同类型的列表,例如List<int>, List<string>, List<int * string>,...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 []
Run Code Online (Sandbox Code Playgroud)
这一切都在函数签名中。我们可以从...
int -> int 并得到一个 List<int> -> List<int>函数int -> int 到Option<int> -> Option<int>string -> float到string [] -> float[]