SIMD与函数式

SIMD

"单指令,多数据",主要用在3D图形运算,物理模拟等项目中。

//可以实现数组的一次性相加
var a = SIMD.Float32x4(1, 2, 3, 4);
var b = SIMD.Float32x4(5, 6, 7, 8);
var c = SIMD.Float32x4.add(a, b); // Float32x4[6, 8, 10, 12]
//通常可以使用在矢量运算上:
v + w = 〈v1, …, vn〉+ 〈w1, …, wn〉
      = 〈v1+w1, …, vn+wn〉

数据类型如Float32x4:四个 32 位浮点数,SIMD支持各种数学运算

函数式

  1. 柯里化把一个多参数函数拆成一系列单参数函数。
function add (a) {
  return function (b) {
    return a + b;
  }
}
// 或者采用箭头函数写法
const add = x => y => x + y;
const f = add(1);
f(1) // 2
  1. 函数合成:
const compose=f=>g=>x=>f(g(x));
const f=compose(x=>x*4)(x=>x+2);
f(2);
  1. 参数倒置:改变函数前两个参数的顺序。
var three = (a, b, c) => [a, b, c];
var flip = f.flip(three);
flip(1, 2, 3); // => [2, 1, 3]
  1. 执行边界(until)指的是函数执行到满足条件为止。
condition = x => x === 5;
until = f.until(condition, inc);
until(3) // 5
  1. 队列操作
f.head(5, 27, 3, 1) // 5
f.last(5, 27, 3, 1) // 1
f.tail(5, 27, 3, 1) // [27, 3, 1]
f.init(5, 27, 3, 1) // [5, 27, 3]
  1. 合并操作:
f.concat([5], [27], [3]) // [5, 27, 3],把多个数组合并为一个
f.concatMap(x => 'hi ' + x, 1, [[2]], 3) // ['hi 1', 'hi 2', 'hi 3'],处理后合并为一个
  1. 配对操作:zip把两个队列的成员一一配对合并为一个队列,不等长的话会把多出来的成员忽略,zipwith第一个参数是函数。
let a = [0, 1, 2];
let b = [3, 4, 5];
let c = [6, 7, 8];
f.zip(a, b) // [[0, 3], [1, 4], [2, 5]]
f.zipWith((a, b) => a + b, a, b, c) // [9, 12, 15]
posted @ 2022-10-25 12:55  梦呓qwq  阅读(48)  评论(0编辑  收藏  举报