多くのプログラミング言語(主に関数型)でかなり一般的なパターンであることは知っていますが、どのように呼び出すのか正確にはわかりません。したがって、リスト A と他のリスト B などの 1 つのデータ構造があります。リスト A にはいくつかの値 (中国語の文字列) が含まれており、この文字列をリスト B にマップして英語に翻訳したいと考えています。いわゆるマップとミューテート。このパターンがどのように正しく命名されているかを教えてください。また、objective-C、Java、Haskell などでの実装へのリンクをいくつか教えてください。
2 に答える
このプロセスは「マッピング」または「マップと変更」(前述のとおり) と呼ばれ、マップできるデータ型Functor
は Haskell の型クラスのインスタンスにすることができます (「ファンクター」は C++ では異なる方法で使用されることに注意してください)。さらに、命令型言語では、このプロセスは foreach スタイルのループを使用して実行できます。
関数型言語
多くの関数型言語はmap
for リストの既定の実装を提供し、他のデータ型の既定の実装も提供する場合があります。たとえば、リストのマッピングの 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 投稿で徹底的に議論されているようです。
このパターンは、言語によっては一般的にmap
orと呼ばれます。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);
}