F# - Result是int列表而不是int列表

时间:2015-06-10 10:03:18

标签: f#

我有一个非常复杂的问题,我为了这个问题已经简化了。

我们只是说问题如下:
我想要一个添加到所有这些数字的前3个数字(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。如何从上面获得所需的输出?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

有很多方法。以下是其中一些:

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

答案 1 :(得分:1)

对于这样的情况,我有点像列表理解语法,因为它似乎对大多数人来说更具可读性 - 所以这是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]

您也应该能够将此用于复杂问题(或者我希望如此)

fun-fact 这个函数有时(是的,它是Haskell ......)被称为liftM2,因为它 (+)提升到列表中-monad ...