我有一个数据类型,
type data = IntData of int list | FloatData of float list
我想编写一个带有签名
map : data -> ('a -> 'a) -> data
的函数,它将把给定的函数应用于数据列表中的每个元素。
出于可以理解的原因,编译器不喜欢以下代码。
let rec map dat func =
match dat with
| IntData il = IntData (List.map func il)
| FloatData fl = FloatData (List.map func fl)
当然,编译器无法理解
func
在每种情况下可能具有不同类型的想法。
另一方面,我想不出如何完成这种行为,除了编写一个单独的地图函数,一个用于
IntData
,另一个用于FloatData
。但这似乎是 OCaml 努力避免的那种浪费性的重复代码。
您可能想要一种可以表示 int 或 float 的数据类型。
type num = Int of i | Float of i
哪里
data
是:
type data = num list
现在您的
func
参数可以是类型为 num -> num
的函数,但不是 num -> 'a
,因为您想要 num
列表作为结果。
当然,这意味着您不能保证您的列表仅包含整数或仅包含浮点数。指定您想要这样做的原因非常重要,因为对于更大的问题可能有更好的解决方案。