OCaml对int与char列表

时间:2017-07-21 16:50:18

标签: list pattern-matching ocaml signature caml

我正在处理一个需要采用签名remaining thelist的原型val remaining : char list -> int * char list = <fun>的函数。我是Ocaml的新手,我不明白如何使Ocaml函数只接受一个列表并输出一个int和一个列表。这是我目前正在使用的代码。

let rec remaining thelist= match thelist with
  | [] -> []
  | [x] -> [x]
  | x::y::t1 ->
      if x='a' then remaining (y::t1)
      else thelist;;

match thelist with
  | [] -> 0
  | x::t1 -> 
    if x='a' then 1+remaining t1
    else 0;;

如果您注释掉第二个块,则第一个代码块会输出正确的char列表。如果注释掉第一个块,则第二个块输出正确的int。我不知道如何在没有某种兼容性错误的情况下组合代码来实现所需的签名。

1 个答案:

答案 0 :(得分:0)

您可以使用产品类型(实际上您的签名建议您这样做)和'隐藏'本地功能

let remaining =
     let rec f i = function
       | 'a'::l -> f (i+1) l
       | l -> i, l
     in
     f 0