Список в F #

Я пытаюсь сделать некоторое понимание списка в F #. И я нашел этот.

let evens n =
    { for x in 1 .. n when x % 2 = 0 -> x }
print_any (evens 10)

let squarePoints n =
    { for x in 1 .. n
      for y in 1 .. n  -> x,y }
print_any (squarePoints 3)

Первый по-прежнему работает нормально, но второй устарел. Последний (1.9.7.8) компилятор F # не поддерживает этот стиль.

После некоторого поиска я нашел, что это работает

let vec1 = [1;2;3]
let vec2 = [4;5;6]
let products = [for x in vec1 do for y in vec2 do yield x*y]

Может ли кто-нибудь указать, почему синтаксис изменился? Благодарю.

Ответы

Ответ 1

  • Вложенные для циклов требуют do.

  • Вам нужно использовать seq {..}. Форма {..} без seq больше не работает.

  • A when guard в шаблоне цикла for также больше не поддерживается.

  • print_any something устарел. Вместо этого используйте printf "%A" something.

Этот код должен работать:

let evens n =
    seq { for x in 1 .. n do if x%2=0 then yield x }
printf "%A" (evens 10)

let squarePoints n =
    seq { for x in 1 .. n do
            for y in 1 .. n  -> x,y }
printf "%A" (squarePoints 3)

Вы все равно можете использовать ->, если все, что вы хотите сделать, это вернуть одно значение:

let vec1 = [1;2;3]
let vec2 = [4;5;6]
let products = [for x in vec1 do for y in vec2 -> x*y]

Кстати, мне интересно посмотреть, как F # эволюционировала с течением времени. Слишком плохо, что ранние усыновители частично устарели на своих полках (не то, что я возражаю).