1

ネットで見つけた例を作ろうとしています。F# の 3D フラクタルです。ここにあります: http://toasp.net/blog/infinite-cheese.aspx . ソース コードは、記事の最後でダウンロードできます。記事とサンプルは 2007 年に書かれたものなので、コードは少し古くなっていると思います。エラーを引き起こし、コードがコンパイルされないコード ブロックが 1 つあります。

// Returns a cube with filtered sides
let private get_cube(incl_sides) =
    [ for (side,trigs) in cube
        when Set.mem side incl_sides
        ->> trigs ]

whenキーワードには下線が引かれ、エラー メッセージは次のようになります。

予期しないキーワード 'when' が式に含まれています。'->' またはその他のトークンが必要です。

これの何が問題なのかわかりません。コードをよりよく理解するために、言語仕様を検索しました。私の知る限り、Set.mem関数や->>演算子については何もありません。何が間違っている可能性がありますか?

4

2 に答える 2

1

試す

[for (side, trigs) in cube do
    if Set.contains side incl_sides then
        yield! trigs]

そのコードが書かれて以来、言語は多くの変更を受けました。特に、->>演算子は に置き換えられyield!Set.memよりわかりやすい に名前が変更され、内包表記はの代わりにSet.contains使用されるようになりました。if ... thenwhen

于 2011-04-04T13:31:05.550 に答える
1

はい、ブログ投稿からリンクされているソース コードのバージョンは少し古いです。最新の (更新された) バージョンは、CodePlexのF# サンプル プロジェクトにあります。他にもいくつか変更があると思いますので、CodePlex からバージョンを取得するのが最善です。(FractalSimple.fsより単純なバージョンと、Fractal.fs表示されていない立方体の側面を削除するバージョンも含まれます)。

プロジェクトには、標準の Visual Studio 2008/2010 プロジェクトが含まれています.fsproj。ブログの元のバージョンは、F# CTP (VS 2005 の時代から) を使用して作成されました。これは、Visual Studio との統合がまったく異なり、廃止された.fsharppプロジェクト形式 (MSBUILD 形式が存在する前) を使用していました。

whenandコンストラクトは->>、クエリを記述するための軽量の構文として使用されてきましたが、言語の残りの部分と一貫性のある内包内の構文を維持するために、現在は非推奨です。kvb が指摘しているように、通常の使用が可能if .. thenであり、唯一の非標準的なものは です。これは、指定された sequence のすべての要素を返すことyield!を意味します。

于 2011-04-04T14:15:13.167 に答える