这个矩阵转置函数有效,但我试图理解它的逐步执行,我不明白.
transpose:: [[a]]->[[a]]
transpose ([]:_) = []
transpose x = (map head x) : transpose (map tail x)
Run Code Online (Sandbox Code Playgroud)
同
transpose [[1,2,3],[4,5,6],[7,8,9]]
Run Code Online (Sandbox Code Playgroud)
它返回:
[[1,4,7],[2,5,8],[3,6,9]]
Run Code Online (Sandbox Code Playgroud)
我不知道连接运算符如何使用map.它是在同一函数调用中连接x的每个头?怎么样?
这是
(map head x)
Run Code Online (Sandbox Code Playgroud)
创建每个列表的头元素列表?
我想创建一个带有签名的函数,该函数seq<#seq<'a>> ->seq<seq<'a>>就像Zip方法一样,采用任意数量的输入序列(而不是Zip2和Zip3中的2或3)并返回序列序列而不是元组作为结果.
也就是说,给出以下输入:
[[1;2;3];
[4;5;6];
[7;8;9]]
Run Code Online (Sandbox Code Playgroud)
它将返回结果:[[1; 4; 7]; [2; 5; 8]; [3; 6; 9]]
除了序列而不是列表.
我对F#很新,但是我已经创建了一个能够满足我想要的功能,但我知道它可以改进.这不是尾递归,似乎它可能更简单,但我不知道如何.我还没有找到一种很好的方式来获得我想要的签名(接受,例如,int list list作为输入)而没有第二个功能.
我知道这可以直接使用枚举器实现,但我有兴趣以功能方式实现它.
这是我的代码:
let private Tail seq = Seq.skip 1 seq
let private HasLengthNoMoreThan n = Seq.skip n >> Seq.isEmpty
let rec ZipN_core = function
| seqs when seqs |> Seq.isEmpty -> Seq.empty
| seqs when seqs |> Seq.exists Seq.isEmpty -> Seq.empty
| seqs ->
let head = seqs |> Seq.map Seq.head
let tail = seqs |> Seq.map …Run Code Online (Sandbox Code Playgroud) 我有兴趣实现fold3,fold4等,类似于List.fold和List.fold2.例如
// TESTCASE
let polynomial (x:double) a b c = a*x + b*x*x + c*x*x*x
let A = [2.0; 3.0; 4.0; 5.0]
let B = [1.5; 1.0; 0.5; 0.2]
let C = [0.8; 0.01; 0.001; 0.0001]
let result = fold3 polynomial 0.7 A B C
// 2.0 * (0.7 ) + 1.5 * (0.7 )^2 + 0.8 * (0.7 )^3 -> 2.4094
// 3.0 * (2.4094) + 1.0 * (2.4094)^2 + 0.01 * (2.4094)^3 -> 13.173
// 4.0 * (13.173) …Run Code Online (Sandbox Code Playgroud) 基本上有这个:
[
[1;2;3];
[4;5;7];
[8;9;0];
]
Run Code Online (Sandbox Code Playgroud)
我想得到这个(垂直读/转90度):
[
[1;4;8];
[2;5;9];
[3;7;0];
]
Run Code Online (Sandbox Code Playgroud)
有谁知道在f#中这样做的简单方法?