つまり、副作用のないアプリを設計する場合などに、F# コードはすべてのコアに自動的に分散されますか?
8 に答える
いいえ、恐れていません。F#が(厳密な意味で)純粋な関数型言語ではないことを考えると、そうするのはかなり難しいと思います。F#で並列処理をうまく利用する主な方法は、非同期ワークフローを使用することです(主に、私が信じている非同期モジュールを介して)。.NET 4.0で導入されているTPL(タスク並列ライブラリ)は、F#でも同様の役割を果たします(ただし、すべての.NET言語で同じように使用できます)。既存の非同期フレームワークとどのように統合されるかを正確に確認してください。おそらく、MicrosoftはすべてにTPLを使用するようにアドバイスするか、あるいは両方をオプションとして残し、最終的には1つがデファクトスタンダードになるでしょう...
とにかく、ここにあなたが始めるためのF#の非同期プログラミング/ワークフローに関するいくつかの記事があります。
F# はそれを自動化するのではなく、簡単にするだけです。
Luca の PDC トークにリンクするもう 1 つのチャンスです。52:20 から始まる 8 分間は、F# 非同期ワークフローのすばらしいデモです。それは揺れる!
いいえ、自動的に並列化されないことは確かです。コードに副作用がないことを知る必要がありますが、これを証明するのは困難です。
もちろん、特に副作用がない場合は、F# を使用するとコードを簡単に並列化できますが、それは別の問題です。
前述の他の製品と同様に、F#はコア間で自動的にスケーリングせず、Joshが言及したParallelFXのポートなどのフレームワークが必要です。
F#は、デフォルトでオブジェクトが不変であるため、並列処理の可能性に一般的に関連付けられており、多くのシナリオでロックする必要がありません。
純度の注釈について:コード コントラクトには Pure 属性があります。BCL のいくつかの部分が既にこれを使用していると聞いたのを覚えています。この属性は並列化フレームワークでも使用できる可能性がありますが、現時点ではそのような作業については知りません。また、コード連絡先が F# 内からどの程度使用できるかさえわからないため、ここには不明な点がたくさんあります。
それでも、これらすべてがどのように組み合わされるかを見るのは興味深いでしょう.
いいえ、それはしません。F# でサポートされている多くのメカニズムのいずれかを使用して、他のスレッドへの呼び出しを明示的にマーシャリングする必要があります。
私の理解では、そうはならないでしょうが、Parallel Extensions はF# で使用できるように変更されています。自動的にマルチスレッド化するわけではありませんが、非常に簡単に実現できるはずです。
答えはわかりましたが、F# がハイブリッドの命令型/関数型言語であるという事実に起因する、これが F# の最も重大な制限であると私が思うことを付け加えたいと思います。
関数がpureであることを宣言する F# の拡張機能をいくつか見てみたいと思います。つまり、関数の型によって示されない副作用はありません。アイデアは、関数が他の「既知の純粋な」関数を参照する場合にのみ純粋であるということです。もちろん、これは、関数パラメーターとして渡されたデリゲートが純粋な関数を参照することを要求できる場合にのみ役立ちます。