I know that it is rather a common pattern in many programming languages (predominantly functional) but I don't know exactly how does it call. So I have one data structure e.g. List A and other List B. List A contains some values (strings in Chinese) and I want to map this strings to List B translating them to English. The so called map and mutate. Can someone please tell how does this pattern named correctly and give some links to its implementation in objective-C , Java , Haskell, etc.
2 回答
这个过程被称为“映射”或“映射和变异”(正如你所提到的),可以映射的数据类型可以是Functor
Haskell 中类型类的实例(请注意,“函子”在 C++ 中的使用方式不同)。此外,在命令式语言中,这个过程可以使用 foreach 风格的循环来完成。
函数式语言
许多函数式语言map
为列表提供了默认实现,也可能为其他数据类型提供默认实现。例如,列表映射的 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上搜索您最喜欢的数据结构并查看源代码。
命令式语言
虽然在命令式语言中,三元素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
或apply
取决于语言。我将使用的示例是将数字列表 [1, 2, 3, 4, 5] 转换为它们的正方形 [1, 4, 9, 16, 15]。
在函数式编程语言中,这通常很简单。例如,在 Haskell
>> 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);
}