我有一个非常复杂的问题,我为了这个问题已经简化了。
我们只是说问题如下:
我想要一个添加到所有这些数字的前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
。如何从上面获得所需的输出?
感谢您的帮助!
答案 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]
答案 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 ...