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

时间:2016-03-20 00:29:40

标签: f#

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

您好,

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

我知道我们可以简单地完成let语句然后执行

let newTemp = Array.zip temp |> listOfWords

但是我想知道是否有办法以某种方式以某种方式反转curried的参数,以便首先应用函数中的第一个参数。这样我就可以不使用另一个let语句。

编辑:

我在想的是,不知何故......如果我可以引用'temp'我可以将自己用作拉链中的第一个参数或者其他东西......虽然我知道它不会起作用,因为它只能占用1功能,它只是自己拉链。

1 个答案:

答案 0 :(得分:5)

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

let temp = listOfWords 
  |> Array.map (fun word -> word.ToCharArray() |> Array.sort) 
  |> Array.map String 
  |> (fun sorted -> Array.zip sorted listOfWords)

或者你可以推广这个并使自己成为一个反转另一个函数的参数的函数。这种功能传统上称为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

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

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

let temp = listOfWords |> Array.map pairWithSorted

实际上不需要zip,也不需要ToCharArray,因为stringIEnumerable<char>