2009-12-11 58 views
19

我想在F#中做一些列表理解。我发现thisF中的列表理解#

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] 

后可有人点为什么语法变化?谢谢。

回答

20
  • 嵌套循环需要do。您需要使用seq {..}。没有seq的表格{..}不再有效。

  • A whenfor循环模式中的后卫也不再受支持。

  • 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#如何随着时间的推移而变得有趣。不好的早期使用者已经在书架上放了部分过时的书(我不介意)。

+2

那么,早期的采用者在当时没有多少选择:) – Benjol 2009-12-14 08:25:38

+3

我们也没有早期采用作者。 ;-) – 2011-02-15 15:03:46