F# 为什么List.append是prepend而不是append
我觉得我在这里误解了什么 假设我有数字1,2,3和4,我想加上5和6。常识告诉我要列出。附加它,但当我尝试时,我得到: [1;2;3;4]|>List.append[5;6] val-it:int-list=[5;6;1;2;3;4]F# 为什么List.append是prepend而不是append,f#,F#,我觉得我在这里误解了什么 假设我有数字1,2,3和4,我想加上5和6。常识告诉我要列出。附加它,但当我尝试时,我得到: [1;2;3;4]|>List.append[5;6] val-it:int-list=[5;6;1;2;3;4] 为什么要在列表中添加值而不是附加值?我认为这是一个奇怪的函数,因为args的顺序不适合管道。相反,顺序反映了结果列表,即,list.append[1;2][3;4]产生[1;2;3;4]它不是真正的预加。您正在使用forward pipe操作符更改参数的显示顺序,
为什么要在列表中添加值而不是附加值?我认为这是一个奇怪的函数,因为args的顺序不适合管道。相反,顺序反映了结果列表,即,
list.append[1;2][3;4]
产生[1;2;3;4]
它不是真正的预加。您正在使用forward pipe操作符更改参数的显示顺序,在本例中,该操作符会反转顺序,但如果您在不更改顺序的情况下编写函数,则更有意义:
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;2;3;4] |> (List.append [5;6])
和
List.append[5;6]
返回一个函数int List->int List
,该函数将输入附加到列表[5;6]
。然后,您将列表[1;2;3;4]
应用于此函数。您感到困惑是完全正确的。从名字上看,这个函数的行为方式并不直观<代码>列表。追加实际上做了(@)
做的事情:
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
,这在口语中被奇怪地翻译为“append input to a”
如果你问我,最好为这个选择一个不同的名称。在管道中,只需将其视为类似于元素级列表扩展,其中“被附加的东西”像往常一样放在前面。可以说,它是预加的。在“将p前置到q”和“将p追加到q”之间,哪个将被写入
追加p q
,哪个将产生pq?