2017-02-21 29 views

ответ

1

просто помните, что строка представляет собой массив из полукокса:

# let s = "ab";; 
    # s.[0];; 
    - : char = 'a' 

Так что, если вам придется возвращать символ для любого из элементов в списке:

# read_line() |> Str.split (Str.regexp " +") |> List.map (fun x -> x.[0]) 
+1

Ну, строго говоря, строка не является массивом символов, последняя - '[| a; b; c |]'. И это доступ с синтаксисом 'x. (I)'. – ivg

0

Из контекста ваших предыдущих вопросов, вам, похоже, на самом деле нужен способ разобрать текст, содержащий сочетание целых чисел и символов, описывающих переходы для конечного автомата. Я бы посоветовал вам лучше всего использовать модуль Scanf. Если вам нужно что-то гораздо более сложное, для этого может потребоваться рукописный сканер (вы можете использовать Str.string_match для этого или - если вы хотите глубоко погрузиться в генератор сканера ocamllex).

Простой пример чтения строки из канала Scanf будет:

let read_transition input = 
    try 
    let line = input_line input in 
    Scanf.sscanf line "%d %c %d" 
     (fun x ch y -> Some (x, ch, y)) 
    with End_of_file -> None 

Обратите внимание, что мы читаем строку с input_line, а не с помощью Scanf.scanf на входной канал непосредственно. Причина в том, что Scanf.scanf может потребоваться до знака, стоящего на вид, и, таким образом, если вы смешаете его с другими способами чтения канала, символы могут пропустить. Используя input_line, а затем Scanf.sscanf (вместо Scanf.scanf), мы избегаем этого углового случая.

Обратите также внимание, что в зависимости от синтаксиса ввода вам может потребоваться соответствующим образом отрегулировать шаблон scanf.

+0

спасибо, что это именно то, что я хочу, но в соответствии с этим вашим предложением мне понадобится функция, которая разделит строку чтения и передаст ее этой функции, чтобы получить список переходов, которые я хочу правильно? –

+0

это дает мне ошибку типа http://pastebin.com/9GvvcRC3 –

+0

Вам нужно будет перебирать входной канал (например, 'stdin'), пока не получите' None'. Вы можете сделать это с помощью цикла while или рекурсивной функции. –