25

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)

最初のものはまだ問題なく動作しますが、2番目のものは時代遅れです。最新(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]

構文が変更された理由を誰かが指摘できますか?ありがとう。

4

1 に答える 1

31
  • ネストされた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)

単一の値を返すだけの場合は、引き続き使用でき->ます。

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

ちなみに、F#が時間の経過とともにどのように進化したかを見るのは興味深いと思います。残念なことに、アーリーアダプターは棚に部分的に時代遅れの本を持っています(私は気にしません)。

于 2009-12-11T16:17:39.003 に答える