根据折叠定义列表长度

时间:2014-11-09 00:03:19

标签: ocaml

这只是一个练习(我意识到下面提到的功能已经在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的两边删除尾随=

我哪里错了?

1 个答案:

答案 0 :(得分:1)

这是价值限制。您对长度的定义不是非常技术性的价值。 Stack Overflow上已经对这个问题进行了一些很好的讨论。我会寻找一个好的。

这是一个非常好的:

  

Why does a partial application have value restriction?