mapReduce
という小さなヘルパーを使用して別の方法で行うこともできます。Ramdaのcurry
を使用して実装することで、他のRambdaライブラリメンバーのような魔法のカレーインターフェイスを共有できます。
mapReduce
は、マッピング関数m
と還元関数r
を効果的に受け取り、新しい還元関数を作成します。これは、あなたが追加ボーナスとして減速に
を生成したいどこでも使用することができますので、便利な汎用的な機能であり、この解決策は、入力配列を通して反復します
を(答えを計算するための最小要件)を1回
// mapReduce :: (a -> b) -> ((c, b) -> c) -> ((c, a) -> c)
const mapReduce = curry ((m, r) =>
(x, y) => r (x, m (y)))
// deepLength :: [[a]] -> Integer
const deepLength = xs =>
reduce (mapReduce (length, add), 0, xs)
// arr :: [[Integer]]
const arr = [[1], [2, 3], [4, 5, 6]]
console.log (deepLength (arr))
// 6
mapReduce
の多様な有用性を実証するために、私は彼らが少し複雑にしているとき、それは物事を処理することが可能であるかを紹介します - まだ
読み取り可能なプログラムを維持しながら、
// mapReduce :: (a -> b) -> ((c, b) -> c) -> ((c, a) -> c)
const mapReduce = curry ((m, r) =>
(x, y) => r (x, m (y)))
// omap :: (a -> b) -> {k : a} -> {k : b}
const omap = curry ((f, o) =>
reduce (mapReduce (k => ({ [k]: f(o[k]) }), Object.assign), {}, keys(o)))
console.log (omap (add(10), {a: 1, b: 2, c: 3}))
// {"a": 11, "b": 12, "c": 13}
実際にデータ構造を '折りたたむ 'ときは' map'を使わないでください。 – ftor