Invalid_argument "String.sub / Bytes.sub"

Invalid_argument "String.sub / Bytes.sub"

我正在做的练习有一个小问题。 我尝试递归地计算字符串中的元音,但出现了这个奇怪的错误。 有人可以向我解释为什么吗?

  let rec nb_voyelle = function chaine ->
                           if chaine == "" then
                             0
                           else
                             let length = (String.length chaine)-1 in
                             let p_length = String.sub chaine 0 length in
                             match chaine.[length] with
                             | 'a' | 'e' | 'i' | 'o' | 'u' | 'y' -> 1 + nb_voyelle p_length
                             | _ -> 0 + nb_voyelle p_length

    ;;

答案是我在最后一个案例中使用“==”来比较字符串,这不是测试两个元素之间相等性的良好普遍性。

因此,情况 (String.sub "" 0 -1) 发生并且函数无法引发此错误。