F# - 结果是 int 列表而不是 int 列表
F# - Result is list of list of int instead of a list of int
我有一个相当复杂的问题,为了这个问题我已经简化了。
姑且说问题如下:
我想要将前 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
。如何从上面获得所需的输出?
感谢您的帮助!
方法有很多种。以下是其中一些:
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]
对于像这样的情况,我有点喜欢列表理解语法,因为它对大多数人来说似乎更易读 - 所以在 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
,因为它 lifts (+)
进入 list-monad ...
我有一个相当复杂的问题,为了这个问题我已经简化了。
姑且说问题如下:
我想要将前 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
。如何从上面获得所需的输出?
感谢您的帮助!
方法有很多种。以下是其中一些:
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]
对于像这样的情况,我有点喜欢列表理解语法,因为它对大多数人来说似乎更易读 - 所以在 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
,因为它 lifts (+)
进入 list-monad ...