関数型プログラミングはどのような種類のGIS問題に対処しますか?


8

F#でのArcObjectsの使用に関する@ray vernagusの投稿を読んだ後、疑問に思っていました... より伝統的な形式のプログラミングとは対照的に、関数型プログラミングではどのような種類のGIS問題がより適切に処理されますか?

おそらくより具体的には、ArcObjectsでC#を使用するよりも、F#を使用した方がよい場合はいつですか?


おそらく、選択するパラダイムはプログラミングの目的によって異なります。リンクの1

@DanPattersonフィードバックをありがとう。私が見たいのは、F#がC#よりも適している特定のGISの問題です。それを見ることができれば、それを学ぶために時間を費やすことを正当化できるかもしれません。マップ代数やネットワークフローソルバーのようなものが良い候補であるというこっそりの疑いがありますが、ケーススタディはまだ見ていません。
カークカイケンダル

1
「マップ代数」(1980年代から)関数型プログラミングです。
whuber

@whuber私は関数型プログラミングを理解しているので、通常は式と考えるものをデータとして扱うことができます。たとえば、スプレッドシートがこれを行います。関数をラスターセルに割り当てる方法がわかりません。これは、ゾーニングマップのようなものをより合理的に作成するために使用できるようです。各ゾーニングカテゴリは、異なる適合性機能を持つことができます。固定資産税収入のような単位で。入力には、周囲のゾーニングが含まれる場合があります。区画を住宅地としてゾーニングすると、敷地が工業地帯に近い場合は、それほど多くの税収が得られない可能性があります。
カークカイケンダル2013年

「関数の計算」に似た別のことを考えていると思います。[Wikipedia]によれば、関数型プログラミングは「計算を数学関数の評価として扱い、状態や可変データを回避するプログラミングパラダイム」です。ほとんどすべてが純粋な関数で構成されているマップ代数は、これの簡単な(ただし限定された)例です。たとえば、Pythonでセルをループする方法は、関数型プログラミングの反対です。現在、強力なFPパラダイムがRMathematicaに存在し、GIS関連の例が数多く提供されています。
whuber

回答:


4

関数型プログラミングが最近流行している最大の理由は、同時実行性です。パフォーマンス上の理由から並列処理を実行できることは、全体的なコンピューティングにおいて非常に重要になり、GISも例外ではありません。関数型プログラミングは、不変性と再帰をどれだけ強調するかによって、並列システムを作成する上でいくつかの重大な利点があります。これらの特性のため、ほとんどの関数型言語は、ロックなどの問題を単純に回避する傾向があり、命令型言語での並列プログラミングは大きな頭痛の種になります。

そうは言っても、関数型プログラミングが提供する多くの機能を実際に活用できるようになるまでには、GIS分野には長い道のりがあると思います。既存のテクノロジーとライブラリは、オブジェクト指向と一般的に必須のアプローチにあまりにも固執しています。悲しいことに、F#からArcObjectsを使用できるからといって、基盤となるライブラリが実際に機能的なプログラミングスタイルで実際にうまくいくとは限りません。


3

厳密にはプログラミングではありませんが、ArcToolboxはより機能的な設計パラダイムに従っています。

  • ほとんどのツールは、一連の入力を受け入れ、関数を実行し、外部状態の影響を受けずに出力を返すように設計されています。
  • ほとんどのツールは既存のレイヤーを編集しませんが、新しいレイヤーを作成します(不変性)。
  • 多くのツールの操作は、マップ機能と似ています。これらは、反復を使用して下位レベルのオブジェクト(ジオメトリ)を処理するのではなく、オブジェクトのセット(機能セット)を操作します。
  • union、intersect、dissolveなどの基本的なツールは、SQLなどの宣言型言語で表現するのが難しい多くの問題を解決できます。

ArcToolboxの機能的アプローチにより、コードを記述することなく空間分析を行うことができます。ユーザーは、レイヤーなどの単純な要素のセットで作業でき、反復、状態の維持、複雑な副作用について心配する必要はありません。


2

私は関数型プログラミングを初めて使用するので、これらはほんの一部の考えです。

F#のレイトレーサーの興味深い例は、関数型プログラミングの長所、つまり高次関数再帰並列処理パターンマッチングなどを示しています。これらの概念の一部を拡張すると、関数型プログラミングが特に適している可能性があるGISの重要な領域の1つとして、ラスター演算が考えられます。

ここに画像の説明を入力してください

編集:これは同じサイトからの別の例です:Rule 30 Cellular Automata

もう1つの考えは、F#でプログラム全体を記述する必要がないということです。メインプログラムをC#で記述し、特定の関数型プログラミングの問題を解決するプロジェクト/アセンブリをF#で作成できます。ILMergeを使用してC#とF#を1つの実行可能ファイル/アセンブリにマージすることもできます。

最後に、あなたがC#で行うことができます関数型プログラミングのものがたくさんありますLINQの使用を通じて、ラムダ式、高階関数(SelectWhereなどなど)、シーケンスパターンマッチングは、


レイトレーサーへのリンクをありがとう。あなたの答えに画像を追加する自由を取りました。
カークカイケンダル2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.