list`扁平化'('名單* B名單)到'「列表*」 B list`我需要在OCaml的一個函數,將採取型 ('a list * b' list) list
和利用它
'a list * b' list
。我已經嘗試了內置函數List.flatten和List.concat,但它們不起作用,它們需要一個類型'c list list
。有人能幫我嗎?功能在OCaml中
1
A
回答
1
您可以使用函數fold_left
這樣做:
開始時你有兩個空表工作作爲蓄電池。對於輸入列表中的每個子列表,將元素添加到各自的累加器中(第一個累加器中的第一個子列表的元素和第二個子列表中的第一個子列表的元素)。
# let flatten l =
let (l1,l2) =
List.fold_left (fun (l1,l2) (x,y) ->
(x :: l1, y :: l2)) ([], []) l in
List.rev (List.flatten l1), List.rev (List.flatten l2);;
val flatten : ('a list * 'b list) list -> 'a list * 'b list = <fun>
#
0
以下應該工作:
let split2 l = (List.map fst l, List.map snd l)
let flatten2' (l1, l2) = (List.flatten l1, List.flatten l2)
let flatten2 l = flatten2' (split2 l)
這裏,split2
會變成一個('a list * 'b list) list
成('a list list * 'b list list)
(fst
和snd
返回一個對所述第一和第二組分,分別地)和flatten2'
將單獨弄平這兩個組件。而flatten2
將最終做你所需要的。您也可以將其封裝到一個函數中,但我認爲這更容易理解。
請注意,List.map
和List.flatten
都不是尾遞歸;如果你需要尾遞歸版本,還有其他庫有它們,或者你可以使用rev_xxx
函數從標準庫建立它們或者從頭開始編寫它們。
2
你要使用的功能List.split
和List.flatten
:
let my_function l =
let (fst_list, snd_list) = List.split l in
List.flatten fst_list, List.flatten snd_list ;;
首先split
函數將生成和'a list list
和'b list list
,那麼你只需要flatten
他們。
1
不幸的是,沒有元組的映射,你需要分解 - 例如,通過採用分體式壓平:
let splcat x = match List.split x with | (a,b) -> (List.flatten a, List.flatten b) ;;
這是它的外觀在命令行:
utop # splcat [([1;2],["a"]); ([3],["uvw";"xyz"]) ] ;;
- : int list * bytes list = ([1; 2; 3], ["a"; "uvw"; "xyz"])
相關問題
- 1. 功能OCaml中
- 2. 功能,在OCaml的
- 3. Ocaml選項功能
- 4. OCaml是否有popcnt功能?
- 5. OCaml合併排序功能
- 6. ocaml的不動點功能
- 7. OCaml中的模式匹配功能
- 8. OCAML:運營商預計將在功能
- 9. 將Log2球拍功能改寫成OCaml功能?
- 10. 從C++移植的功能,ocaml的
- 11. 語法錯誤ocaml的功能
- 12. OCaml的 - 錯誤的功能類型
- 13. OCaml - 實現直方圖功能
- 14. OCaml簽名的未知功能
- 15. ocaml的EVAL從類型功能
- 16. OCaml - 識別此功能的類型
- 17. ocaml的樹簡單的功能
- 18. 創建C實現OCaml的功能
- 19. OCaml的:綁定表達式v功能
- 20. 轉換ocaml的功能以流
- 21. Ocaml cmi文件---獲取功能簽名
- 22. 在Ocaml中定義常用功能的位置?
- 23. 已在ocaml asmrun庫中定義的主要功能
- 24. 如何在Ocaml電池中使用功能?
- 25. 我做區分OCaml中的功能和我有一些問題
- 26. 書的第95頁上忽略功能OCaml中
- 27. OCaml標準庫中是否有「flip」功能?
- 28. OCaml - 簽名中未包含測試功能
- 29. OCaml中的排序功能不起作用
- 30. OCaml - 如果地圖在標準OCaml中?
這是好的,但我需要的東西做 '(「名單*」 B名單)名單 - >'a list *'b list' and not '('a *'b)list - >'a list *'b list' – measuretheory
我更新了答案:) – alifirat
但它仍然不是我所需要的:(順序不是那麼重要,重要的是函數中的輸入是什麼,你給出'('a *'b)列表 - >'列表*'列表',我需要'('列表*'b列表)列表 - >'列表*'列表' – measuretheory