在Python中,map()适用于遵循序列协议的任何数据.无论我是用字符串还是列表甚至元组提供它,它都能做出正确的事情.
我不能在OCaml吃蛋糕吗?除了查看我正在使用的集合类型并查找相应的List.map或Array.map或Buffer.map或String.map之外,我真的别无选择吗?其中一些甚至不存在!我要求的是不寻常的吗?我肯定错过了什么.
你会得到这个最接近的是模块Enum
在OCaml中有电池(原EXTLIB).Enum
定义地图和折叠Enum.t
; 您只需使用转换为/来自Enum.t
您的数据类型.转换可以相当轻,因为Enum.t
是懒惰的.
你真正想要的是Haskell风格的类型,比如Foldable
和Functor
(它概括了"地图").哈斯克尔库定义的情况下Foldable
,并Functor
为列表,数组,和树木.另一种相关技术是通用编程的"Scrap Your Boilerplate"方法.由于OCaml不支持类型类或更高级别的多态性,我认为你不能在它的类型系统中表达这样的模式.
OCaml有两个主要解决方案:
几年前,Jacques Garrigue已经为许多数据结构实现了语法轻,但效率低的方法.您只需将集合包装在提供map
方法的对象中.然后,您可以collection#map
将map函数用于任何类型的集合.这比您的要求更通用,因为它允许在运行时替换不同类型的数据结构.但是,这在实践中并不是很有用,因此该方法从未被广泛采用.
语法较重但高效,健壮且静态的解决方案是使用函子来对您正在使用的数据结构进行参数化.这使得使用不同的数据结构重用代码变得微不足道.有关一些很好的例子,请参见Markus Mottl的Okasaki的书"Purely Functional Data Structures"的OCaml翻译.
如果你不是在寻找那种能力而只是想要简洁,那么你当然可以创建一个名字较短的模块别名(例如模块S = String).