作为一个 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
.
查看签名square
isint -> int
和squareArray
is int [] -> int []
。那就是举重!
如果您查看Array.map
is的签名('a -> 'b) -> 'a [] -> 'b []
,可以将其解释为从 type 接收一个函数'a
和'b
一个'a
s 数组并返回一个'b
s 数组。但它也可以解释为从'a
to ' 接收一个函数并从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[]