【问题标题】:Is it possible for a variable to reference itself during a sequence of pipe operators, F#变量是否可以在一系列管道运算符中引用自身,F#
【发布时间】:2016-07-06 15:45:20
【问题描述】:
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

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

编辑:

我的想法是,不知何故...如果我可以引用“temp”,我可以将它自己用作 zip 或其他东西的第一个参数...虽然我知道这行不通,因为它只能取 1函数,它会自己压缩它。

【问题讨论】:

    标签: f#


    【解决方案1】:

    您可以将输入通过管道传输到 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,因为string就是IEnumerable<char>

    【讨论】:

      猜你喜欢
      • 2016-02-21
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-31
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多