首页 > 解决方案 > OCaml - 如果然后其他

问题描述

我想在 if then 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 ()

我想知道如何让里面的所有东西都能正常工作。因为我得到Syntax error。先感谢您。

标签: if-statementocaml

解决方案


这段代码有很多问题。

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

但是,无论何时let出现在其他任何地方(在声明或表达式中),它都用于定义局部变量,并且后面必须跟in使用局部定义的表达式。由于您in的定义中没有first_approachand second_approach,因此您的代码在语法上无效。

由于 和 内部的定义first_approachsecond_approach本地的,调用后不会有任何效果。等等的定义char1,即使在语法上更正,也不会是全局的。(正如@melpomene 所说,代码没有做任何事情。)

如果您有多个用分隔的表达式,您可以在or之后;使用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".

推荐阅读