2

多くのプログラミング言語(主に関数型)でかなり一般的なパターンであることは知っていますが、どのように呼び出すのか正確にはわかりません。したがって、リスト A と他のリスト B などの 1 つのデータ構造があります。リスト A にはいくつかの値 (中国語の文字列) が含まれており、この文字列をリスト B にマップして英語に翻訳したいと考えています。いわゆるマップとミューテート。このパターンがどのように正しく命名されているかを教えてください。また、objective-C、Java、Haskell などでの実装へのリンクをいくつか教えてください。

4

2 に答える 2

7

このプロセスは「マッピング」または「マップと変更」(前述のとおり) と呼ばれ、マップできるデータ型Functorは Haskell の型クラスのインスタンスにすることができます (「ファンクター」は C++ では異なる方法で使用されることに注意してください)。さらに、命令型言語では、このプロセスは foreach スタイルのループを使用して実行できます。

関数型言語

多くの関数型言語はmapfor リストの既定の実装を提供し、他のデータ型の既定の実装も提供する場合があります。たとえば、リストのマッピングの Haskell 実装は次のとおりです。

map :: (a -> b) -> [a] -> [b]
map _ []     = []
map f (x:xs) = f x : map f xs

chineseToEnglish :: [String] -> [String]
chineseToEnglish chineseStrings = map translate chineseStrings

より複雑なデータ構造には、より複雑な例があります。Hoogleでお気に入りのデータ構造を検索して、ソースを調べてみてください。

命令型言語

命令型言語では、3 要素forループが配列を反復処理する標準的な方法を提供しますが、C++11、Java、および Obj-C にはすべて、より多くのマップ関連のforループもあります。

C++

C++11 は、新しい ranged-for ループで反復子の抽象化を提供します。

vector<string> chinese;
for (auto &s : chinese) {
    translate(s);
}

iteratorクラスの拡張は他の場所で説明されています

ジャワ

Java も同様の構造を提供しますが、自動型推論や明示的な参照は必要ありません。

ArrayList<LanguageString> chinese = new ArrayList();
for (LanguageString s : chinese) {
    s.translate();
}

拡張については、別の場所でIterable説明されています

Objective-C

私は Obj-C について言及した他の人ほど詳しくはありませんが、その件名はこの SO 投稿で徹底的に議論されているようです。

于 2013-10-02T15:29:13.740 に答える
3

このパターンは、言語によっては一般的にmaporと呼ばれます。applyここで使用する例は、[1, 2, 3, 4, 5] の数字のリストを [1, 4, 9, 16, 15] の四角形に変換するものです。

関数型プログラミング言語では、これは一般的に簡単です。たとえば、ハスケルでは

>> let numbers = [1, 2, 3, 4, 5]
>> map (\x -> x^2) numbers
[1, 4, 9, 16, 25]

関数感覚の言語であるRでは

>> numbers = c(1, 2, 3, 4, 5)
>> sapply(numbers, function(x) {x^2})
[1] 1  4  9 16 25

またはPythonで

>> numbers = [1, 2, 3, 4, 5]
>> map(lambda x: x**2, numbers)
[1, 4, 9, 16, 25]

Java などのファーストクラス関数をサポートしない言語では、通常、これにループを使用します。

int[] numbers = {1, 2, 3, 4, 5};
int[] result  = new int[5];

for (i = 0; i < numbers.length; i++)
{
    result[i] = Math.pow(numbers[i], 2);
}
于 2013-10-02T14:45:49.857 に答える