提升一个功能

Tar*_*tar 1 f# functional-programming function lifting

作为 F# 新手,我在理解术语“提升”时遇到问题,并且无法正确提升功能。

例如,我如何解除以下功能以及它将如何影响功能行为。

let add item element = item :: element
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。

AMi*_*res 5

看看这个页面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可以对整个整数数组进行平方,而且很容易创建!我需要做的就是传递squareArray.map.

查看签名squareisint -> intsquareArrayis 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 -> intOption<int> -> Option<int>
  • ...或从string -> floatstring [] -> float[]