为什么List.append前置而不是追加

时间:2014-11-24 21:08:36

标签: f#

我觉得我在这里误解了一些东西。

假设我有数字1,2,3和4,我想为它添加5和6。常识告诉我List.append它,但当我尝试时,我得到:

  

[1; 2; 3; 4] |> List.append [5; 6] ;;

     

val it:int list = [5; 6; 1; 2; 3; 4]

为什么它会将值添加到我的列表中而不是附加它们?

4 个答案:

答案 0 :(得分:16)

它并不是真正的前期。您通过使用正向管道运算符来更改参数显示的顺序,在这种情况下会反转顺序,但如果您在不改变顺序的情况下编写函数,则更有意义:

List.append [1;2;3;4] [5;6]   // [1;2;3;4;5;6]

请注意,这与Array.appendSeq.append一致。它还与字符串连接运算符一致,即函数(+)

前锋运营商'移动'表达式开头的最后一个参数,在某些情况下可能是期望的(管道),但在其他情况下可能会令人困惑,例如,如果您将其用作管道的一部分,则将其划分为函数(/) ,有一位前瞻员:

5 |> (/) 10

评估结果为10 / 5但乍一看,您可能会得到错误的印象,它会将5除以10。

答案 1 :(得分:5)

我认为这是一个奇怪的功能,因为args的顺序对管道不起作用。相反,订单会反映结果列表,即List.append [1;2] [3;4]会产生[1;2;3;4]

答案 2 :(得分:5)

这被解析为

[1;2;3;4] |> (List.append [5;6])

List.append [5;6]返回一个函数int list -> int list,它将输入附加到列表[5;6]。然后,您将列表[1;2;3;4]应用于此功能。

答案 3 :(得分:1)

你很困惑。这个函数的行为方式根本不直观。 List.append实际执行(@)所做的事情:

List.append ['a'] ['b'] // ['a'; 'b']
['a'] @ ['b']           // ['a'; 'b']
(@) ['a'] ['b']         // ['a'; 'b']

如果我说“将 a 附加到 b ”,我希望结果为 ba 。将“添加 a ”语句添加到集合 s 中:它写为Set.add a s。但是List.append交换了参数的位置,这是特别危险的,因为参数具有相同的类型。现在,人们可以将其视为“附加a和b”,但即使在口语中也不是很好的语法。

因此,管道运算符只是无意义地读取:input |> append a等于append a input,这奇怪地转换为“用口语将”输入添加到“。

如果你问我,最好为这个选择一个不同的名字。