В чем разница между `::` и `@` в f#?

#list #f#

Вопрос:

Я попытался добавить дополнительный элемент в свой список строк. Сначала я подумал о том, чтобы добавить этот пункт в свой список :: .

 let test = ["hello"];;
let newtest = test :: ["world"];;
 

Это бросило меня в заблуждение:

   let newtest = test :: ["world"];;
  -----------------------^^^^^^^

stdin(36,24): error FS0001: This expression was expected to have type
    'string list'    
but here has type
    'string'
 

Это только начало работать @ .
Однако на нескольких вопросах SO для создания нового списка :: используется метод.
Для того , чтобы использовать :: , я в конечном итоге создал список списков, который определенно не является тем, что я искал.

 let newtest01 = test :: [["world"]];;
val newtest01 : string list list = [["hello"]; ["world"]]
 

Может кто-нибудь, пожалуйста, объяснить разницу между ними?

Ответ №1:

Оператор :: («минусы») используется для построения списков путем добавления (или сохранения) элемента в существующий список. Оператор @ (‘добавить’) используется для объединения двух списков. Вам следует прочитать эту тему.

 > let test = ["hello"];;
val test : string list = ["hello"]

> let newTest1 = "world" :: test;;
val newTest1 : string list = ["world"; "hello"]

> let newTest2 = test @ ["world"];;
val newTest2 : string list = ["hello"; "world"]