簡體   English   中英

F#-結果是int列表的列表,而不是int列表

[英]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 intlist 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]

鏈接: https//dotnetfiddle.net/oUpZna

對於這種情況,我有點喜歡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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM