作为一个 F# 新手,我在理解术语“Lifting”时遇到了问题,我无法正确地提升功能。
例如,我如何提升以下功能以及它将如何影响功能行为。
let add item element = item :: element
任何帮助,将不胜感激。
作为一个 F# 新手,我在理解术语“Lifting”时遇到了问题,我无法正确地提升功能。
例如,我如何提升以下功能以及它将如何影响功能行为。
let add item element = item :: element
任何帮助,将不胜感激。
看看这个页面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.
查看签名squareisint -> int和squareArrayis int [] -> int []。那就是举重!
如果您查看Array.mapis的签名('a -> 'b) -> 'a [] -> 'b []
,可以将其解释为从 type 接收一个函数'a和'b一个'as 数组并返回一个'bs 数组。但它也可以解释为从'ato ' 接收一个函数并从to'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 []
这一切都在函数签名中。我们可以从...中获取一个函数
int -> int并获得一个List<int> -> List<int>功能int -> int 到Option<int> -> Option<int>string -> float到string [] -> float[]