関数型言語の標準ドキュメント(OOのUMLなど)はありますか?erlangで書かれたcouchdbをダウンロードし、私がショックを受けたソースコードを見た後、ドキュメントの行はほとんどありません。これらすべての機能が互いにどのように依存しているかを文書化する必要はありませんか?自由に利用できる、より適切に文書化された中規模のプロジェクトがありますか?このパラダイムを使用して物事がどのように行われるかを学びますか?
3 に答える
Haskell や ML などの関数型言語では、型と、場合によってはモジュール型 (標準 ML では「シグネチャ」と呼ばれる) があり、型は非常に多くのドキュメントを提供します。コンパイラによって型がチェックされないSchemeのような関数型言語では、代わりに「コントラクト」を使用します。
Erlang は Ericsson で開発されました。通信業界には非常に強い文化とテストの実績があります。これらの関数がどのように機能するかのドキュメントがテスト スイートのどこかにあるとしても、私は驚かないでしょう。
要約:標準に最も近い 2 つのものは、型 (静的型システムを持つ関数型言語の場合) とコントラクト (静的型システムを持たない関数型言語の場合) です。
言語に関係なく、コードを文書化する必要があります。
EDocと呼ばれる標準のドキュメントスタイルがあるようです。EDocは外部APIドキュメントを作成できます。1つのソースからの引用:
EDocはErlangAPIをErlangコード内に直接文書化するためのErlang標準アプリケーションです。
これはerlang.orgのドキュメントセクションで参照されています:
EDocを使用すると、「@ Name ...」形式のタグを使用して、ソースコード自体にコメントとしてErlangプログラムのドキュメントを記述できます。ソースファイルには、EDocがドキュメントを生成するためのタグが含まれている必要はありませんが、タグがないと、結果には、モジュールから抽出できる基本的な利用可能な情報のみが含まれます。
焦点を絞ったグーグル検索はここからあなたを連れて行きます。
これは非常に興味深い問題です。
2 つの問題があります。1 つ目は、コードにコメントを付けることと、ドキュメントを (テキスト形式で) 書くことです。これは、OO 言語と同じように通常の方法で行う必要があります。プロジェクトで使用するすべてのモジュール、関数、および型の概要を書くだけです。F# (.NET の関数型言語) では、F# とほぼ同様の方法で XML コメントを記述し、これらのコメントからドキュメントを生成できます。MSDN のF# ドキュメントは、これらのコメントから自動的に生成されていると思います。F# ソース コードの例を次に示します (VS 2008 に F# をインストールすると、コア ライブラリのソース コードもインストールされます。これは興味深いリソースになる可能性があります)。
/// Return the first element of the list.
///
/// Raises <c>System.ArgumentException</c> if <c>list</c> is empty
val head: list:'T list -> 'T
あなたが言及した2番目のことはUMLです-関数型言語の図を描くための標準はありません。これは難しい問題のようです。ただし、特定のライブラリを使用するコードのダイアグラムを作成することは確かに可能です。多くの機能ライブラリでは、いくつかの単純な関数を構成することでコードを構成できます。リスト処理は良い例です:
let custNames = customers |> List.map (fun customer -> customer.Name)
let empNames = employees |> List.map (fun employee -> employee.Name)
let result = List.concat [custNames; empNames]
これは、データ フローを描画することで視覚的にうまく表現できます。
+-----------+ +-----+
| customers |--->| map |\
+-----------+ +-----+ \ +--------+ +--------+
>| concat |-->| result |
+-----------+ +-----+ / +--------+ +--------+
| employees |--->| map |/
+-----------+ +-----+
多くの機能ライブラリで同様の描画を行うことができ、非常に便利なようです (ホワイトボードで何かを議論するときに描画するようなものです)。ただし、私が知る限り、これを自動的に行うツールはありません (可能なはずですが)。