[英]F# - Result is list of list of int instead of a list of int
我有一個非常復雜的問題,出於這個問題的目的已經簡化了。
我們只說問題如下:
我想要將前三個數字(1,2,3)添加到所有這些數字的列表:0,10,20
所以我想要以下期望的輸出 :
all = [1; 2; 3; 11; 12; 13; 21; 22; 23]
這是我編寫的代碼:
let r = [0;10;20];;
let r2 = [1..3];;
let rshift value = r2 |> List.map (fun (x)-> x + value)
let all = r |> List.map (fun x-> rshift x)
實際輸出為:
val allshift : int list list = [[1; 2; 3]; [11; 12; 13]; [21; 22; 23]]
如您所見,這是一個list of a list of ints
,而不只是一個list of int
長list of int
。 如何從上方獲得所需的輸出?
謝謝你的幫助!
有很多方法。 這里是其中的一些:
let adder1 l1 l2 =
l1
|> List.map(fun x -> l2 |> List.map(fun y -> y + x))
|> List.concat
let adder2 l1 l2 =
l1
|> List.collect(fun x -> l2 |> List.map(fun y -> y + x))
let adder3 l1 l2 =
l1
|> List.fold(fun acc x -> acc @ (l2 |> List.map(fun y -> y + x))) []
let r = [0;10;20]
let r2 = [1..3]
adder1 r r2 |> printfn "%A"
adder2 r r2 |> printfn "%A"
adder3 r r2 |> printfn "%A"
打印:
[1; 2; 3; 11; 12; 13; 21; 22; 23]
[1; 2; 3; 11; 12; 13; 21; 22; 23]
[1; 2; 3; 11; 12; 13; 21; 22; 23]
對於這種情況,我有點喜歡list-comprehension語法,因為對於大多數人來說,它似乎更具可讀性-因此,在Foggy給您的東西之外,還有另一種可能性:
let addAllCombinations xs ys =
[ for y in ys do for x in xs -> (x+y) ]
明顯的用法:
> addAllCombinations [1;2;3] [0;10;20];;
val it : int list = [1; 2; 3; 11; 12; 13; 21; 22; 23]
顯而易見的概括當然是
let combineWith op xs ys =
[ for y in ys do for x in xs -> op x y ]
這里:
> combineWith (+) [1..3] [0;10;20];;
val it : int list = [1; 2; 3; 11; 12; 13; 21; 22; 23]
您也應該可以將其用於您的復雜問題(或者,我希望如此)
有趣的是,此功能有時(是Haskell ...)被稱為liftM2
因為它將(+)
提升到list-monad中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.