我想在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
答案 0 :(得分:1)
您在代码中的问题是,在此匹配中:
| h1::q1, h2 | h1, h2 -> if h1 = h2 then x else -1
您尝试将单个字符h1
与h2
类型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
或类似的特殊值来表示错误情况是不好的风格。而是在这种情况下使用可选类型。