2017-02-21 78 views

回答

1

只記得一個字符串是字符數組:

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

所以,如果你必須返回一個char您的任何名單的元素:

# 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循環或遞歸函數來做到這一點。 –