【问题标题】:F# - Reverse Pipeline orderF# - 反向管道顺序
【发布时间】:2011-03-13 14:31:30
【问题描述】:

我怎么能这样:

let printTeams x : unit = 
    let rnd = new Random()
    Seq.toList x |> List.sortBy (fun x -> rnd.Next()) |> printTeams'

但不是:

let printTeams x : unit = 
    let rnd = new Random()
    printTeamsRec'  <| Seq.toList x <| List.sortBy(fun x -> rnd.Next())

我刚刚收到最后一个错误,上面写着:

类型不匹配。期待一个字符串 列表 -> 'a -> 'b 但给定 a
字符串列表 -> 单元类型 ''a -> 'b' 与类型 'unit' 不匹配

错误发生在第三行printTeamsRec'

任何帮助将不胜感激。

【问题讨论】:

  • 在 F# 中使用如果多次调用会为同一元素返回不同值的投影是否有效?

标签: f#


【解决方案1】:

两件事:前向管道到后向管道的翻译不正确,优先级不同。

let printTeams x : unit = 
    let rnd = new Random()
    printTeamsRec' <| (List.sortBy(fun x -> rnd.Next()) <| Seq.toList x)

【讨论】:

  • 我想我认为我不能先对一个尚不存在的列表进行排序,因此使翻译变得完全不同..但是是的,你是对的。 - 谢谢!
  • 如果你想省略括号,反向管道很好,但是当你有多个步骤时,你应该总是使用正向管道(这也更合乎逻辑)。 List.sortBy(fun x -> rnd.Next()) |> Seq.toList x |> printTeamsRec'
  • @ebb - 不客气!表达式 List.sortBy(fun x-&gt; rnd.Next()) 是一个部分应用的函数,因此在向后管道运算符应用表达式 Seq.toList x 的值之前不会执行排序。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
相关资源
最近更新 更多