提升功能

时间:2018-10-28 05:43:29

标签: function functional-programming f# lifting

作为F#的新手,我在理解“提升”一词时遇到了问题,我无法正确提升函数。

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

let add item element = item :: element

任何帮助将不胜感激。

1 个答案:

答案 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

查看签名squareint -> int,而squareArrayint [] -> 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