2015-03-03 45 views
0

我有一個源代碼如下。我不明白它的語法。 [g | t <- ts; g <- symbols t]很奇怪。請幫我解釋一下,或者推薦任何與之相關的書籍或文件。非常感謝如何訪問Ocaml上的列表中的成員

type term = V of string | F of string * term list 

let rec symbols = function 
    | V x -> [x] 
    | F (f, ts) -> f :: [ g | t <- ts; g <- symbols t ] 

let rec functions = function 
    | V _ -> [] 
    | F (f, ts) -> f :: [ g | t <- ts; g <- functions t ] 
+0

https://en.wikipedia.org/wiki/List_comprehension – Kakadu 2015-03-03 11:21:19

回答

1

這是list comprehension的非標準語法。我不知道任何記錄它的書。這個想法是它應該類似set builder notation。總之,這個表達式將被評估以列出:

[ x | p <- expr; p * 2 - 1 ] 

其中expr應該求列表,p將被分配給所述列表中的相應元件,從而使p * 2 - 1將被應用到原始的每個元素名單。

在正常OCaml的語法,這可以表示爲

List.map (fun p -> p * 2 + 1) xs 

最後一點,我不會suggest你使用這個列表解析符號。它沒有工具支持,首先,現代OCaml中並不常見。

P.S.而例如表達

f :: [ g | t <- ts; g <- symbols t ] 

香草OCaml的是

f :: List.(map symbols ts |> concat) 
+0

這是可疑的。我認爲這種理解更像是'cartesian_product xs ys |> List.map(fun(x,y) - > x + y)' – Kakadu 2015-03-03 11:26:32

+0

是的,看起來你是真的,讓我修復這個帖子。謝謝 – ivg 2015-03-03 11:30:12

+0

我認爲還有一個問題。函數'符號'返回一個列表,但你似乎期望一個符號值。也許你需要在某處添加'concat' .... – Kakadu 2015-03-03 11:34:31