1

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

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

let add item element = item :: element

任何帮助,将不胜感激。

4

1 回答 1

5

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

查看签名squareisint -> intsquareArrayis 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 -> intOption<int> -> Option<int>
  • ...或从string -> floatstring [] -> float[]
于 2018-10-28T06:55:29.813 回答