F # выполняет итерации через кортежи задом наперед? - PullRequest
2 голосов
/ 05 ноября 2010

Я создал небольшой набор языков, и при использовании его в интерактивном окне они отображаются в обратном порядке. Это нормальное поведение F #?

let languages = ("English", "Spanish", "Italian")
let x, y, z = languages

val languages : string * string * string = ("English", "Spanish", "Italian")
val z : string = "Italian"
val y : string = "Spanish"
val x : string = "English"

Ответы [ 3 ]

4 голосов
/ 05 ноября 2010

Вы создаете три переменные одновременно с независимыми значениями.Заказ здесь не актуален.F # interactive может печатать значения в любом порядке.

Что важно, так это оценка порядка в вашем коде, а spec говорит, что это слева направо, когда вы вызываете функцию или конструктор, создание записи и т. д.

> (printfn "a", printfn "b");;
a
b
2 голосов
/ 30 марта 2011

Я не уверен, существует ли соединение, но перенос выражений F # в цитаты может дать вам представление о семантике языка, и в следующем вы увидите, что именованные значения действительно связаны в обратном порядке, как показано в ФГУ:

> <@ let languages = ("English", "Spanish", "Italian") in let x, y, z = languages in () @> |> string;;
val it : string =
  "Let (languages,
     NewTuple (Value ("English"), Value ("Spanish"), Value ("Italian")),
     Let (z, TupleGet (languages, 2),
          Let (y, TupleGet (languages, 1),
               Let (x, TupleGet (languages, 0), Value (<null>)))))"

Обратите внимание, что это по-прежнему согласуется с ответом @ Laurent, в котором утверждается, что выражения аргумента в конструкции кортежа вычисляются слева направо. В следующем примере показано, как результат построения кортежа связывается с промежуточным именованным значением, которое затем деконструируется с использованием выражений TupleGet без побочных эффектов.

> <@ let x,y = (stdin.Read(), stdin.ReadLine()) in () @> |> string;;
val it : string =
  "Let (patternInput,
     NewTuple (Call (Some (Call (None, System.IO.TextReader ConsoleIn[Object](),
                                 [])), Int32 Read(), []),
               Call (Some (Call (None, System.IO.TextReader ConsoleIn[Object](),
                                 [])), System.String ReadLine(), [])),
     Let (y, TupleGet (patternInput, 1),
          Let (x, TupleGet (patternInput, 0), Value (<null>))))"
2 голосов
/ 05 ноября 2010

Так же FSI печатает кортежи, когда я разлагаю их на своем компьютере.

например:

let x, y = ("a", "b") ;;

val y : string = "b"
val x : string = "a"

Немного странно, что он печатает "в обратном порядке", но я не уверен, что я бы назвал это поведением F # так же, как и поведением FSI или симпатичным поведением печати. ​​

Если вам нужны все детали, вы всегда можете взглянуть на исходный код:

http://fsharppowerpack.codeplex.com/

...