当前位置:  开发笔记 > 编程语言 > 正文

OCaml是否具有通用map()/ reduce()函数?

如何解决《OCaml是否具有通用map()/reduce()函数?》经验,为你挑选了2个好方法。

在Python中,map()适用于遵循序列协议的任何数据.无论我是用字符串还是列表甚至元组提供它,它都能做出正确的事情.

我不能在OCaml吃蛋糕吗?除了查看我正在使用的集合类型并查找相应的List.map或Array.map或Buffer.map或String.map之外,我真的别无选择吗?其中一些甚至不存在!我要求的是不寻常的吗?我肯定错过了什么.



1> Chris Conway..:

你会得到这个最接近的是模块Enum在OCaml中有电池(原EXTLIB).Enum定义地图和折叠Enum.t; 您只需使用转换为/来自Enum.t您的数据类型.转换可以相当轻,因为Enum.t是懒惰的.

你真正想要的是Haskell风格的类型,比如FoldableFunctor(它概括了"地图").哈斯克尔库定义的情况下Foldable,并Functor为列表,数组,和树木.另一种相关技术是通用编程的"Scrap Your Boilerplate"方法.由于OCaml不支持类型类或更高级别的多态性,我认为你不能在它的类型系统中表达这样的模式.


不,我不同意你认为解决OP问题的方法.无论它们有什么优点,Functor都不提供Python和Haskell所带来的语法轻量级重载.

2> Jon Harrop..:

OCaml有两个主要解决方案:

    几年前,Jacques Garrigue已经为许多数据结构实现了语法轻,但效率低的方法.您只需将集合包装在提供map方法的对象中.然后,您可以collection#map将map函数用于任何类型的集合.这比您的要求更通用,因为它允许在运行时替换不同类型的数据结构.但是,这在实践中并不是很有用,因此该方法从未被广泛采用.

    语法较重但高效,健壮且静态的解决方案是使用函子来对您正在使用的数据结构进行参数化.这使得使用不同的数据结构重用代码变得微不足道.有关一些很好的例子,请参见Markus Mottl的Okasaki的书"Purely Functional Data Structures"的OCaml翻译.

如果你不是在寻找那种能力而只是想要简洁,那么你当然可以创建一个名字较短的模块别名(例如模块S = String).

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有