这只是一个练习(我意识到下面提到的功能已经在List
中实现)。
假设我有一个包含以下行的界面
val length : 'a list -> int
val fold : init:'acc -> f:('acc -> 'a -> 'acc) -> 'a list -> 'acc
......我实现fold
就像这样:
let rec fold ~init ~f l =
match l with
| [] -> init
| h :: t -> fold ~init:(f init h) ~f:f t
我希望现在能够像这样实现length
let length = fold ~init:0 ~f:(fun c _ -> (c + 1))
...但编译器抱怨
Values do not match:
val length : '_a list -> int
is not included in
val length : 'a list -> int
当然,我知道我可以像这样实施length
let length l = fold ~init:0 ~f:(fun c _ -> (c + 1)) l
...但我不明白为什么我无法从l
的两边删除尾随=
。
我哪里错了?
答案 0 :(得分:1)
这是价值限制。您对长度的定义不是非常技术性的价值。 Stack Overflow上已经对这个问题进行了一些很好的讨论。我会寻找一个好的。
这是一个非常好的: