讓我們lst
成為一個包含我想要反轉每個元組的串列(元組的順序需要相同)。例如:
[(a,b);(c,d)] -> [(b,a);(d,c)]
我知道它可以用地圖來完成:
List.map (fun (a,b) -> (b,a)) [(1,2);(3,4)];;
- : (int * int) list = [(2, 1); (4, 3)]
但我正在尋找一種方法來實作它List.fold_left
。我的方法是將串列與[]
作為累加器的累加器進行匹配,以將每個反向元組連接在一起,但我不斷收到型別錯誤:
List.fold_left (fun (a,b) -> (b,a)) [] lst;;
uj5u.com熱心網友回復:
List.fold_left
接受三個引數:
- 型別函式
'a -> 'b -> 'a
- 型別的累加器
'a
- 型別串列
'b list
您的函式(fun (a,b) -> (b,a))
缺少一個引數,即累加器,您希望在該引數上連接反向對
(fun acc (a,b) -> (b,a) :: acc)
uj5u.com熱心網友回復:
@Lhooq 和 @rithvik 的答案大多是準確的,但會顛倒結果串列中元組的順序。
我們需要將結果提供給List.rev
或使用List.fold_right
.
utop # List.fold_left (fun acc (a, b) -> (b, a) :: acc) [] [(1, 2); (3, 4)] |> List.rev;;
- : (int * int) list = [(2, 1); (4, 3)]
utop # List.fold_right (fun (a, b) acc -> (b, a) :: acc) [(1, 2); (3, 4)] [];;
- : (int * int) list = [(2, 1); (4, 3)]
uj5u.com熱心網友回復:
在這里使用List.map
似乎是一個自然的選擇,因為您可以執行以下操作:
List.map (fun (a, b) -> (b, a)) lst
但是,如果您想使用,List.fold_left
則需要反轉每一對,然后將其添加到累加器串列中:
List.fold_left (fun acc (a, b) -> (b, a)::acc) [] lst
由于 fold_left 采用以下函式簽名:('a -> 'b -> 'a) -> 'a -> 'b list -> 'a
,您需要確保您的第一個引數是一個函式,該函式接受一個累加器串列和一個單獨的串列元素(在本例中為元組),然后回傳一個串列。
編輯:@Chris 正確地指出,使用此解決方案,元組本身的順序也會翻轉。您可以通過使用 包裝函式來解決此問題List.rev
,或者您可以將元組附加到串列的末尾而不是 cons-ing:
List.fold_left (fun acc (a, b) -> acc@[(b, a)]) [] lst
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/493745.html