43

UML は、OO 言語で記述されるソフトウェアのモデリングを目的とした標準であり、Java と密接に関連しています。それでも、関数型プログラミングのパラダイムで書かれることを意図したソフトウェアをモデル化するために使用できるでしょうか? 埋め込まれたビジュアル要素を考えると、どの図が役立つでしょうか?

関数型プログラミング、具体的には Haskell を対象としたモデリング言語はありますか? 図をまとめるためにどのツールをお勧めしますか?

OP 2009 年 9 月 2 日編集:

私が探しているのは、コード内で何が起こっているかを最も視覚的かつ軽量に表現することです。わかりやすいダイアグラム、必ずしも他のプログラマー向けではない視覚的モデル。すぐに Haskell でゲームを開発する予定ですが、このプロジェクトは卒業制作のためのものであるため、提案されたソリューションの何らかの形式化を導入する必要があります。UML + Java 標準に相当するものがあるかどうか疑問に思っていましたが、Haskell 用です。ストーリーボード、記述された説明、形式化されていない図 (いくつかの浅いフローチャートのような画像)、形式化されていないユースケースの説明に固執する必要がありますか?

2012 年 6 月 21 日、jcolebrand が編集:

質問者はもともと視覚的な比喩を望んでいたことに注意してください.3年経った今、私たちはより多くの/より良いツールを探しています. 元の回答はどれも「ビジュアル メタファー デザイン ツール」の概念を実際に扱っていなかったので、それが新しいバウンティが提供しようとしているものです。

4

11 に答える 11

43

Haskell のモデリング言語は「math」と呼ばれていると思います。学校で教えられることが多いです。

于 2009-09-01T19:34:32.557 に答える
31

はい、Haskell には広く使用されているモデリング/仕様言語/手法があります。それらは視覚的ではありません。

Haskell では、型は部分的な仕様を提供します。場合によっては、この仕様が意味/結果を完全に決定する一方で、さまざまな実装の選択肢が残されます。Haskell を超えて、Agda や Coq (とりわけ) のように依存型を持つ言語に移行すると、型は完全な仕様としてより頻繁に役立ちます。

型だけでは不十分な場合は、正式な仕様を追加します。これは多くの場合、単純な機能形式を取ります。(したがって、Haskell で選択するモデリング言語は Haskell 自体または「数学」であるという答えになると思います。) このような形式では、すべてが効率ではなく、明快さと単純さのために最適化された関数定義を提供します。定義には、無限領域での関数の等価性などの計算不可能な操作が含まれる場合もあります。次に、段階を追って、仕様を効率的に計算可能な関数型プログラムの形式に変換します。すべてのステップでセマンティクス (表示) が維持されるため、最終的な形式 (「実装」) は元の形式 (「仕様」) と意味的に同等であることが保証されます。このプロセスは、「

典型的な導出のステップは、ほとんどが「等式推論」の適用であり、数学的帰納法 (および共帰納法) のいくつかの適用で補強されています。このような単純で有用な推論を実行できることは、そもそも関数型プログラミング言語の主な動機であり、その有効性は「真の関数型プログラミング」の「表示的」性質によるものです。(「表示的」および「真に関数的」という用語は、Peter Landin の影響力のある論文The Next 700 Programming languagesに由来します。) したがって、純粋な関数型プログラミングを求める声は、以前は「等式推論に適している」とされていましたが、その説明は聞いていません。最近ではほとんど同じです。ハスケルでは、IOIOSTM)。denotative/non-IO型は正しい等式推論に適していますが、IO/non-denotative 型は不正確な等式推論には適していません。

Haskell の作業で可能な限り頻繁に使用する derivation-from-specification の特定のバージョンは、私が「セマンティック型クラス射」(TCM) と呼んでいるものです。データ型のセマンティクス/解釈を提供し、TCM の原則を使用して、型クラスのインスタンスを介して型の機能のほとんどまたはすべての意味を (多くの場合、一意に) 決定するという考え方です。たとえば、Image型の意味は 2D 空間からの関数であると言います。次に、TCM の原則はMonoid、 、FunctorApplicativeMonadContrafunctor、およびComonadインスタンスの意味を、関数のインスタンスに対応するものとして教えてくれます。それはたくさんあります非常に簡潔で説得力のある仕様を持つ画像の便利な機能の ! (仕様とは、セマンティック関数に、セマンティック TCM 原則が保持されなければならない標準型クラスのリストを加えたものです。) それでも、画像を表現する方法には非常に自由があり、セマンティック TCM 原則によって抽象化の漏れが排除されます。この原則の実際の例をいくつか見てみたい場合は、論文「型クラス射による表示設計」を参照してください。

于 2012-06-22T00:21:08.240 に答える
21

Isabelle や Coq などの定理証明器を使用して、(検証を伴う) 正式なモデリングを行います。「低レベル」の Haskell 実装を導出する前に、ドメイン固有言語 (Cryptol など) を使用して高レベルの設計を行うことがあります。

多くの場合、Haskell をモデリング言語として使用し、実際の実装を書き換えることで導き出します。

QuickCheck プロパティは、型やモジュールの分解とともに、デザイン ドキュメントでも役割を果たします。

于 2009-09-02T06:37:13.650 に答える
13

はい、ハスケルです。

関数型言語を使用するプログラマーは、設計を考える際に、選択した言語を単純化する必要性を感じていないという印象を受けます。これは、UML が何をしているかを理解するための 1 つの (むしろばかげた) 方法です。

于 2009-09-01T19:34:53.287 に答える
6

エリック・マイヤーやサイモン・ペイトン・ジョーンズなどのビデオインタビューをいくつか見たり、インタビューを読んだりしました。問題領域のモデリングと理解に関しては、型シグネチャ、特に関数シグネチャを使用しているようです。

シーケンス図 (UML) は、機能の構成に関連している可能性があります。静的クラス図 (UML) は、型シグネチャに関連付けることができます。

于 2010-02-05T17:06:27.950 に答える
5

Haskell では、型ごとにモデル化します。

実装なしで関数、クラス、およびデータの署名を記述することから始めて、型が適合するようにしてください。次のステップは QuickCheck です。

たとえば、並べ替えをモデル化するには:

class Ord a where
    compare :: a -> a -> Ordering

sort :: Ord a => [a] -> [a]
sort = undefined

次にテスト

prop_preservesLength l = (length l) == (length $ sort l)
...

そして最後に実装...

于 2010-02-05T17:13:50.977 に答える
4

使用を推奨するものではありませんが (ダウンロードできないようです)、HOPS システムはターム グラフを視覚化します。これは、多くの場合、関数プログラムの便利な表現です。

ホップのスクリーンショット

プログラムの文書化と構築をサポートするため、設計ツールと見なすこともできます。必要に応じて用語の書き直しを行うこともできると思います。

残念ながら、もはや積極的に開発されていないと思います。

于 2012-06-26T11:11:14.113 に答える
2

私はパーティーに遅れたことに気づきましたが、誰かが役に立つと思った場合に備えて、まだ答えを出します.

私は、SADT/IDEF0 のような体系的な方法論に行くと思います。

このようなダイアグラムは、Linux、Windows、および MacOS の両方で利用可能な Dia プログラムで作成できます。

于 2014-04-23T09:46:49.333 に答える
2

Hideki John Reekie 著Realtime Signal Processing: Dataflow, Visual, and Functional Programming で説明されているように、データ フロー プロセス ネットワーク モデルを作成できます。

たとえば (Haskell) のようなコードの場合:

fact n | n == 0    = 1
       | otherwise = n * fact (n - 1)

視覚的な表現は次のようになります。

ここに画像の説明を入力

于 2016-04-16T19:42:32.350 に答える
1

数学でHaskellをモデル化することのポイントは何でしょうか?Haskellの全体的なポイントは、数学者がそれを拾い上げて実行できるほど数学と密接に関連しているということだと思いました。なぜあなたは言語をそれ自体に翻訳するのですか?

別の関数型プログラミング言語(f#)を使用する場合、ホワイトボード上の大きなブロックを説明する図を使用し、クラスを使用してUMLを使用してオブジェクト指向の方法でシステムをモデル化しました。f#のビルディングブロックにわずかなミスマッチがありました(クラスをデータ構造とそれらに作用する関数に分割しました)。しかし、ビジネスの観点から理解するために、それは扱いました。問題はビジネス/Web指向であり、この手法がもう少し経済的なものにどれほどうまく機能するかはわかりません。私はおそらく関数を状態のないオブジェクトとしてキャプチャし、それらがうまく収まるはずだと思います。

それはすべてあなたが働いているドメインに依存します。

于 2010-10-12T02:59:26.767 に答える