19

Python map() では、シーケンス プロトコルに従うすべてのデータに対して機能します。文字列、リスト、またはタプルのいずれをフィードしても、正しいこと^TMを実行します。

私のケーキも OCaml に入れられませんか? 使用しているコレクション型を調べて、対応する List.map または Array.map または Buffer.map または String.map を見つける以外に、本当に他に選択肢はないのでしょうか? これらのいくつかは存在さえしません!私が求めているのは異常ですか?私は何かが欠けているに違いない。

4

4 に答える 4

18

これに最も近いのはEnumOCaml Batteries Included(以前のExtlib)のモジュールです。Enumマップを定義し、折り返しEnum.tます; Enum.tデータ型との間の変換を使用する必要があります。Enum.t怠惰であるため、変換はかなり軽量になります。

本当に必要なのは、 and (「マップ」を一般化する)のようなHaskellスタイルの型クラスです。Haskellライブラリは、リスト、配列、ツリーのインスタンスとそのインスタンスを定義します。もう1つの関連する手法は、ジェネリックプログラミングへの「ボイラープレートを廃棄する」アプローチです。OCamlは型クラスやより高度なポリモーフィズムをサポートしていないので、その型システムでこのようなパターンを表現することはできないと思います。FoldableFunctorFoldableFunctor

于 2008-11-06T18:51:48.767 に答える
11

OCamlには2つの主な解決策があります:

  1. Jacques Garrigueは、数年前に、構文的には軽いが非効率的なアプローチを多くのデータ構造にすでに実装しています。メソッドを提供するオブジェクトでコレクションをラップするだけですmapcollection#map次に、あらゆる種類のコレクションにマップ関数を使用できます。これは、実行時にさまざまな種類のデータ構造を置き換えることができるため、要件よりも一般的です。ただし、これは実際にはあまり有用ではないため、このアプローチが広く採用されることはありませんでした。

  2. 構文的に重いが効率的で堅牢で静的なソリ​​ューションは、ファンクターを使用して、使用しているデータ構造に対してコードをパラメーター化することです。これにより、コードをさまざまなデータ構造で再利用するのは簡単になります。いくつかの素晴らしい例については、オカサキの本「純粋関数型データ構造」のMarkusMottlのOCaml翻訳を参照してください。

そのような力を探しておらず、簡潔にしたい場合は、もちろん、短い名前のモジュールエイリアスを作成できます(例:モジュールS =文字列)。

于 2009-05-06T11:16:58.820 に答える
1

問題は、各コンテナーが異なる表現を持ち、マップ/リデュースを反復処理するために異なるコードが必要になることです。これが、個別の機能がある理由です。ほとんどの言語は、コンテナ用のある種の一般的なインターフェース(あなたが言及したシーケンスプロトコルなど)を提供するため、マップ/リデュースなどの機能を抽象的に実装できますが、これはあなたが言及したタイプに対しては行われません。

于 2008-11-06T19:13:42.593 に答える
-3

モジュールで型 t と val の比較 (: t->t->int) を定義している限り、Map.Make は必要なマップを提供します。

于 2008-11-29T02:58:56.793 に答える