2

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.

4

2 回答 2

7

这个过程被称为“映射”或“映射和变异”(正如你所提到的),可以映射的数据类型可以是FunctorHaskell 中类型类的实例(请注意,“函子”在 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 帖子中进行了彻底的讨论。

于 2013-10-02T15:29:13.740 回答
3

这种模式通常被称为mapapply取决于语言。我将使用的示例是将数字列表 [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);
}
于 2013-10-02T14:45:49.857 回答