获取子字符串中第一个和最后一个char的位置

时间:2018-01-16 14:25:33

标签: string substring ocaml

我想在OCaml中创建一个函数,它返回子字符串中第一个和最后一个char的位置。例如,my_sub "tar" "ar"将返回(1,2),但如果我my_sub "tabr" "ar"它将是Nil,则它必须是连续的。我怎么能这样做?

修改

我尝试制作代码,但我遇到了问题

let rec pos_sub l t n =
  let rec aux l1 l2 x =
    match l1, l2 with
    | [], _ | _, [] | [], [] -> -1
    | h1::q1, h2 | h1, h2 -> if h1 = h2 then x else -1
    | h1::q1, h2::q2 -> if h1 = h2 then aux q1 q2 x+1 else -1
  in
  match l, t with
  | [], _ -> (-1,-1)
  | h1::q1, h2::q2 -> if h1 = h2 then (n, (aux q1 q2 n+1)) else pos_sub q1 t n+1

它说:

  

此or-pattern左侧的变量h1的类型为'a          但在右侧,它有'列表'类型          类型变量'a出现在'列表

aux

的第二场比赛中

1 个答案:

答案 0 :(得分:1)

您在代码中的问题是,在此匹配中:

| h1::q1, h2 | h1, h2 -> if h1 = h2 then x else -1

您尝试将单个字符h1h2类型string进行比较。这是错误消息试图告诉您的内容。我认为您打算匹配大小写,其中h2是搜索字符串的最后一个字符,因此:

| h1::q1, h2:[] | h1:[], h2:[] -> if h1 = h2 then x else -1

并且由于q1未使用,因此可以简化为:

| h1::_, h2:[] -> if h1 = h2 then x else -1

sidenode:使用-1或类似的特殊值来表示错误情况是不好的风格。而是在这种情况下使用可选类型。