将数据从一个数据结构映射到另一个

Mai*_*r00 2 java haskell design-patterns functional-programming map

我知道它是许多编程语言中的一种常见模式(主要是功能性的),但我不确切地知道它是如何调用的.所以我有一个数据结构,例如列表A和其他列表B.列表A包含一些值(中文字符串),我想将这些字符串映射到列表B,将它们翻译成英语.所谓的地图和变异.有人可以告诉我这个模式是如何正确命名的,并在objective-C,Java,Haskell等中给出一些指向它的实现的链接.

Ell*_*son 7

这个过程被称为"映射"或"映射和变异"(正如你所提到的),可以映射的数据类型可以是FunctorHaskell中类型类的实例(注意"functor"在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
Run Code Online (Sandbox Code Playgroud)

对于更复杂的数据结构,存在更复杂的示例.尝试在Hoogle上搜索您喜欢的数据结构并查看来源.

命令式语言

而在命令式语言中,3元素for循环提供了迭代数组的标准方法,C++ 11,Java和Obj-C也都有更多与地图相关的for循环.

C++

C++ 11在其新的ranged-for循环中提供了对迭代器的抽象:

vector<string> chinese;
for (auto &s : chinese) {
    translate(s);
}
Run Code Online (Sandbox Code Playgroud)

其他地方iterator已经解释了扩展课程

Java的

Java提供了类似的构造,但没有自动类型推断或需要显式引用:

ArrayList<LanguageString> chinese = new ArrayList();
for (LanguageString s : chinese) {
    s.translate();
}
Run Code Online (Sandbox Code Playgroud)

扩展Iterable也被其他地方所解释.

Objective-C的

我不像我提到的其他人那样熟悉Obj-C,但是这个主题似乎已经在这篇SO帖子中得到了彻底的讨论.