F#是否有可能在一系列管道运算符中引用自身,F#

Luk*_* Xu 4 f#

let sortStringAsKey (listOfWords : string array) = 
    let temp = listOfWords 
            |> Array.map (fun word -> word.ToCharArray() |> Array.sort)
            |> Array.map String
            |> Array.zip listOfWords
    temp
Run Code Online (Sandbox Code Playgroud)

你好,

我写了一些这样的代码,它接受一个单词列表并对它们进行排序,然后创建一个像这样的元组(originalWord,sortedWord); 我希望元组看起来像这样(sortedWord,originalWord).

我知道我们可以简单地完成let语句,然后再做

let newTemp = Array.zip temp |> listOfWords
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有办法以某种方式以某种方式反转curried参数,以便首先应用函数中的第一个参数.这将让我在不使用另一个let语句的情况下完成它.

编辑:

我在想的是,不知何故......如果我可以引用'temp'我可以将自己用作zip中的第一个参数或者其他东西......虽然我知道它不会起作用,因为它只能使用1个函数而且它只需将它自己压缩.

Fyo*_*kin 5

您可以将输入传递给lambda表达式:

let temp = listOfWords 
  |> Array.map (fun word -> word.ToCharArray() |> Array.sort) 
  |> Array.map String 
  |> (fun sorted -> Array.zip sorted listOfWords)
Run Code Online (Sandbox Code Playgroud)

或者你可以推广这个并使自己成为一个反转另一个函数的参数的函数.这种功能传统上称为flip:

let flip f a b = f b a

let temp = listOfWords 
  |> Array.map (fun word -> word.ToCharArray() |> Array.sort) 
  |> Array.map String 
  |> (flip Array.zip) listOfWords
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我个人会这样做:

let pairWithSorted word = 
   let sorted = word |> Seq.sort |> Seq.toArray |> String
   sorted, word

let temp = listOfWords |> Array.map pairWithSorted
Run Code Online (Sandbox Code Playgroud)

真的没有必要zip,也没有必要ToCharArray,因为stringIEnumerable<char>.