如何在if then else块中使用String.index和嵌套函数调用

时间:2017-04-21 15:54:07

标签: string ocaml

我实际上是oCaml的新手并且正在努力学习。 我的一个职能面临着一个大问题。 它位于一个简单的函数(下面)里面,我想通过检查它是否有'@'然后是''来检查电子邮件地址的有效性。和每个之前和之后的文本。 (我不想使用正则表达式,如果您只知道如何使用正则表达式,我真的很抱歉,但我不会考虑正则表达式的答案^^')。

以下是代码,提前谢谢:

let checkMail mail =
if String.contains mail '@' = false
then false
else
    let tmp = String.sub mail (String.index mail '@') ((string_length mail) - (String.index mail '@')) in;;
    if tmp.length < mail.length && String.contains tmp '.' = true
    then
        let last = String.sub tmp (String.index tmp '.') ((string_length tmp.length - 1) - (String.index tmp '.')) in;;
        if last.length < tmp.length && last.length > 1
        then true
        else false
    else false

;;

此外,我在ocaml提示符中收到此错误:File "yolo.ml", line 8, characters 105-107: Error: Syntax error

这对应于第二个if调用,当我试图通过最后调用String.index来找到正确的子字符串大小时。它出现在'@'

如果您有任何想法,请随意分享:)!

2 个答案:

答案 0 :(得分:1)

我看到的第一个问题是这一行:

let tmp = String.sub mail (String.index mail '@')
    ((string_length mail) - (String.index mail '@')) in;;

;;是你输入的顶级信号(OCaml REPL),它应该评估你到目前为止输入的内容。在此代码中,由于尚未输入完整表达式,因此会导致语法错误。

恕我直言,将;;视为只在与顶层交谈时输入的内容真的很有帮助。它不是OCaml语言本身的一部分(尽管我总是看到相反的谣言)。

答案 1 :(得分:1)

确实,有一些错误的Ocaml语法;)

let checkMail mail =
if String.contains mail '@' = false
then false
else
    let tmp = String.sub mail (String.index mail '@') ((String.length mail) - (String.index mail '@')) in
if String.length tmp < String.length mail && String.contains tmp '.' = true
    then
        let last = String.sub tmp (String.index tmp '.') ((String.length tmp - 1) - (String.index tmp '.')) in
 if String.length last < String.length tmp  && String.length last > 1
        then true
        else false
    else false;;

值得注意的是:

  • last.length不是Ocaml语法,除非last是记录。
  • 与string_length相同:String.length。
  • 和;;它出现在2个位置的关键字之后