F#中的列表理解

Yin*_*Zhu 19 f# functional-programming list-comprehension list

我想在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)
Run Code Online (Sandbox Code Playgroud)

第一个仍然正常,但第二个已经过时了.最新的(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]
Run Code Online (Sandbox Code Playgroud)

有人能指出为什么语法改变了?谢谢.

cfe*_*ern 21

  • 嵌套for循环需要一个do.

  • 你需要使用seq {..}.{..}没有的表格seq不再起作用.

  • 一个when在保护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)
Run Code Online (Sandbox Code Playgroud)

你仍然可以使用->if你想要做的就是返回一个值:

let vec1 = [1;2;3]
let vec2 = [4;5;6]
let products = [for x in vec1 do for y in vec2 -> x*y]
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我觉得有趣的是看F#随着时间的推移如何演变.太糟糕了,早期采用者已经在他们的货架上部分过时的书(不是我想的).

  • 我们也没有尽早采纳作者.;-) (4认同)
  • 那么,早期采用者当时没有太多选择:) (2认同)