2011-03-13 160 views
2

怎么说,我可以这样做:F# - 反向管道顺序

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()) 

我只是在最后一个,它说得到一个错误:

类型不匹配。期望的字符串 列表 - >“一 - >” B但给予
字符串列表 - >单元类型‘’一个 - >‘B单元‘

错误’不类型相匹配’发生在第三行printTeamsRec'

任何帮助将不胜感激。

+1

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

回答

6

有两件事:将向前的管道翻译为向后的管道不正确,优先顺序不同。

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

我想我以为我不能先排序一个没有存在的列表,并因此使翻译有很大的不同。但是,你的e是正确的。 - 谢谢! – ebb

+0

如果你想省略小括号,反向管道很好,但是当你有多个步骤时,你应该总是使用正向管道(这也是更合理的)。 List.sortBy(fun x - > rnd.Next()) |> Seq.toList x |> printTeamsRec' –

+0

@ebb - 不客气!表达式'List.sortBy(fun x-> rnd.Next())'是一个部分应用的函数,所以排序不会执行,直到向后管道运算符应用表达式Seq.toList x的值。 –