我觉得我在这里误解了一些东西。
假设我有数字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]
为什么它会将值添加到我的列表中而不是附加它们?
答案 0 :(得分:16)
它并不是真正的前期。您通过使用正向管道运算符来更改参数显示的顺序,在这种情况下会反转顺序,但如果您在不改变顺序的情况下编写函数,则更有意义:
List.append [1;2;3;4] [5;6] // [1;2;3;4;5;6]
请注意,这与Array.append
和Seq.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
,这奇怪地转换为“用口语将”输入添加到“。
如果你问我,最好为这个选择一个不同的名字。