我知道这是许多编程语言(主要是功能性)中的一种常见模式,但是我不知道它怎么调用。
所以我有一个数据结构例如列表A和其他列表B。列表A包含一些值(中文字符串),我想将此字符串映射到列表B并将其翻译为英语。所谓的map和mutate。有人可以告诉这个模式如何正确命名,并提供一些在Objective-C,Java,Haskell等中的实现方式链接。
最佳答案
此过程称为“映射”或“映射并变异”(如您所述),可以映射的数据类型可以是Haskell中Functor
类型类的实例(请注意,在C ++中,“ functor”的用法有所不同) )。另外,在命令式语言中,可以使用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在其新的range-for循环中提供了对迭代器的抽象:
vector<string> chinese;
for (auto &s : chinese) {
translate(s);
}
扩展
iterator
类的是explained elsewhere爪哇
Java提供了类似的构造,但是没有自动类型推断或显式引用的需要:
ArrayList<LanguageString> chinese = new ArrayList();
for (LanguageString s : chinese) {
s.translate();
}
扩展
Iterable
也是explained elsewhere。物镜
我不像我提到的其他对象那样熟悉Obj-C,但是似乎已经在this SO post上进行了全面讨论。