我找不到從用戶給出的值獲取列表的方式。我已經做了如何從ocaml中的用戶輸入中獲取char列表
# read_line() |> Str.split (Str.regexp " +") |> List.map int_of_string;;
但不知道如何做相同的字符。
我找不到從用戶給出的值獲取列表的方式。我已經做了如何從ocaml中的用戶輸入中獲取char列表
# read_line() |> Str.split (Str.regexp " +") |> List.map int_of_string;;
但不知道如何做相同的字符。
只記得一個字符串是字符數組:
# let s = "ab";;
# s.[0];;
- : char = 'a'
所以,如果你必須返回一個char您的任何名單的元素:
# read_line() |> Str.split (Str.regexp " +") |> List.map (fun x -> x.[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模式。
感謝這正是我想要的,但根據你的建議,我需要一個函數,將分割讀取線,並將其饋送到此函數來獲得我想要的轉換列表對嗎? –
它給我一個類型錯誤http://pastebin.com/9GvvcRC3 –
你需要遍歷輸入通道(例如'stdin'),直到你得到'None'。你可以用while循環或遞歸函數來做到這一點。 –
嗯,嚴格來說,一個字符串不是一個字符數組,後者是'[| a; b; c |]'。它使用'x。(i)'語法訪問。 – ivg