OCaml - Если тогда еще - PullRequest
       12

OCaml - Если тогда еще

0 голосов
/ 01 октября 2018

Я хочу сделать несколько вещей внутри, если тогда еще.Я читаю строку, а затем проверяю ее длину.Если 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 голосов
/ 11 октября 2018

Вы можете назначить несколько переменных в одном разрешении, используя

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 строки.

0 голосов
/ 01 октября 2018

С этим кодом довольно много проблем.

На внешнем уровне модуля (например, исходный файл или вход REPL) вы можете использовать let var = val для определения глобальной переменной.В вашем коде вы используете эту конструкцию, например, для определения str.

Однако, когда let появляется где-либо еще (внутри объявления или выражения), он используется для определения local переменная, за которой должно следовать in и выражение, в котором используется локальное определение.Поскольку у вас нет in в ваших определениях first_approach и second_approach, ваш код синтаксически недействителен.

Поскольку определения внутри first_approach и second_approach являются локальными, существуетне будет никакого эффекта после того, как вы позвоните им.Определения для char1 и т. Д., Даже если они синтаксически исправлены, не будут глобальными.(Как говорит @melpomene, код ничего не делает.)

Если у вас есть несколько выражений, разделенных ;, вы можете использовать begin / end, чтобы сгруппировать их в одно выражение после then или else.

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".
отсутствует.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...