Mai*_*r00 2 java haskell design-patterns functional-programming map
我知道它是许多编程语言中的一种常见模式(主要是功能性的),但我不确切地知道它是如何调用的.所以我有一个数据结构,例如列表A和其他列表B.列表A包含一些值(中文字符串),我想将这些字符串映射到列表B,将它们翻译成英语.所谓的地图和变异.有人可以告诉我这个模式是如何正确命名的,并在objective-C,Java,Haskell等中给出一些指向它的实现的链接.
这个过程被称为"映射"或"映射和变异"(正如你所提到的),可以映射的数据类型可以是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++ 11在其新的ranged-for循环中提供了对迭代器的抽象:
vector<string> chinese;
for (auto &s : chinese) {
translate(s);
}
Run Code Online (Sandbox Code Playgroud)
Java提供了类似的构造,但没有自动类型推断或需要显式引用:
ArrayList<LanguageString> chinese = new ArrayList();
for (LanguageString s : chinese) {
s.translate();
}
Run Code Online (Sandbox Code Playgroud)
扩展Iterable也被其他地方所解释.
我不像我提到的其他人那样熟悉Obj-C,但是这个主题似乎已经在这篇SO帖子中得到了彻底的讨论.