JavaScript
1const sum = (list) => list.reduce((accumulator, item) => { return accumulator + item }, 0); 2 3const multiplyBy = (byHowMuch) => (list) => list.map((item) => item * byHowMuch); 4 5const isLargerThan = (value) => (comparedValue) => comparedValue > value; 6 7const displayLog = (value) => { console.log(value) }; 8 9const compose = (log, compare, sum, multiplyBy) => (list) => log(compare(sum(multiplyBy(list)))); 10 11// trueが期待通りに出力されます。動作確認済み。 12compose(displayLog, isLargerThan(10), sum, multiplyBy(10))([1, 2, 3, 4, 5]);
カーリー化や関数合成が本を読んだだけでは身につかなさすぎるので、コードを実際に書いてみようと思って書いてみたのですが、関数型プログラミングっぽくなってますでしょうか?コード自体は動作確認済みなので動きますが。(単なる練習で書いたので実用的では全くないです。。。)
const compose = (log, compare, sum, multiplyBy) => (list) => log(compare(sum(multiplyBy(list))));
特に、この行の関数で他の関数の結果をラップしまくってるところとか、こんなことするんでしたっけ?
あと、例えば、10以上じゃない場合はdisplayLogを実行しないみたいなことをするには、どのようにすれば良いのでしょうか?
const displayLog = (value) => { value && console.log(value)};
例えばこんな感じで、単純に条件式を中で書くしかないですよね?条件式が複数、一つの関数内に出てきてしまうと手続き的になってしまうから好ましくないってだけであって、1つ出てくる分には当たり前??いや、引数に渡ってきた値によって処理を変えるのをその該当関数で判断させるのは、本来の仕事意外のことも担うことになるから好ましくない???
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/12 02:10
退会済みユーザー
2017/10/12 02:22