OCaml-否则

时间:2018-10-01 19:02:51

标签: if-statement ocaml

我想在if else里面做几件事。 我读了一个字符串,然后检查它的长度。如果为3,则执行X;如果为4,则执行Y。

我尝试过:

let str = read_line ()

let first_approach () =
    if String.lenght str = 3
    then let    char1 = String.get str 0
         let    char2 = String.get str 1
         let    char3 = String.get str 2
    else ()

let second_approach () =
    if String.lenght str = 3
    then let    char1 = String.get str 0
         let    char2 = String.get str 1
         let    char3 = String.get str 2
         let    char4 = String.get str 3
    else ()

我想知道如何使然后中的所有东西正常工作。因为出现语法错误。 预先谢谢你。

2 个答案:

答案 0 :(得分:1)

此代码存在很多问题。

在模块的最外层(例如,源文件或REPL输入),您可以使用let var = val来定义全局变量。例如,在您的代码中,您正在使用此构造定义str

但是,每当let出现在其他任何地方(在声明或表达式内)时,它都用于定义 local 变量,并且必须紧跟in和表达式其中使用本地定义。由于您在infirst_approach的定义中没有second_approach,因此您的代码在语法上无效。

由于first_approachsecond_approach中的定义是局部的,因此调用它们后将无效。 char1等的定义即使经过语法校正也不会是全局的。 (正如@melpomene所说,代码没有执行任何操作。)

如果您有多个用;隔开的表达式,则可以使用begin / end将它们分组为thenelse之后的一个表达式。

let f x =
    if x > 5 then
        begin
        Printf.printf "x is quite large\n";
        Printf.printf "adios\n"
        end

如果字符串s的长度为3,则没有字符String.get s 3

# let s = "abc";;
val s : string = "abc"
# String.get s 3;;
Exception: Invalid_argument "index out of bounds".

答案 1 :(得分:0)

您可以使用在一个let中分配多个变量。

let (a, b, c) = (1, 2, 3)

或使用您的字符串示例:

let (char1, char2, char3, char4_opt) =
    if String.lenght str = 3
    then (str.[0], str.[1], str.[2], None)
    else (str.[0], str.[1], str.[2], Some str.[3])

注意:我将char4_opt与选项类型一起使用,因为长度为3的字符串没有内容可放在其中。