2017-02-21 17 views
0

ユーザーが指定した値からリストを取得する方法が見つかりません。私はすでにしたocamlのユーザー入力からcharのリストを取得する方法

# read_line() |> Str.split (Str.regexp " +") |> List.map int_of_string;; 

しかし、どのようにcharsのために同じことを行うのか分からない。文脈から

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

答えて

1

は単なる文字列はcharの配列であることを覚えています以前の質問のうち、実際には、ステートマシンの遷移を記述する整数と文字が混在するテキストを解析する方法が必要なようです。私はあなたがこれのためにScanfモジュールをもっともうまく扱うことをお勧めします。しかし、もっと複雑なものが必要な場合は、手書きスキャナーが必要になるかもしれません(Str.string_matchを使用してください。または、深く掘り下げたい場合はocamllexスキャナジェネレーターを使用してください)。

scanfのでチャネルからラインを読み込む簡単な例は次のようになります。私たちはinput_lineの行を読んではなく、直接入力チャンネルにScanf.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 

注意。その理由は、Scanf.scanfには先読みの文字を必要とする可能性があるため、チャンネルを読み込む他の方法と混合すると文字がスキップされる可能性があるからです。 input_lineを使用し、次にScanf.sscanfScanf.scanfではなく)を使用することで、そのコーナーケースを回避します。

入力の構文によっては、それに応じてscanfパターンを調整する必要があるかもしれないことにも注意してください。

+1

厳密に言えば、文字列は文字配列ではなく、後者は '[| a; b; c |]'です。そして 'x(i)'構文でアクセスします。 – ivg

0

:あなたはあなたのリストの要素のいずれかの文字を返す必要があれば

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

:だから、

+0

これは私が欲しいものですが、あなたのこの提案によれば、私は読んだ行を分割し、この関数にフィードして、私が必要とする遷移のリストを得る関数が必要でしょうか? –

+0

それは私にタイプエラーを与えるhttp://pastebin.com/9GvvcRC3 –

+0

あなたが 'None'を得るまで入力チャンネル(例えば' stdin')を反復する必要があります。これは、whileループまたは再帰関数で行うことができます。 –

関連する問題