2017年4月30日日曜日

関数型プログラミングの基礎 リスト7.62 reduceメソッドによるfromArray関数

var fromArray= (array) => {
 retrun array.reduce((acumulator,item) => {
       return list.append(acumulator)(list.cons(item,list.empty()));
      },list.empty());
};

reduceは、配列用のfoldr関数という説明があった。
最初、なぜ、それで、上記のfromArrayがリストを返すのかがよくわからなかったが、
よく考えたらわかった。
accumuratorがリスト(配列からreduceを使って蓄積されたもの)だから、確かにそうなる。

2017年4月22日土曜日

yコンビネータ

関数型プログラミングの基礎に
コラムとしてYコンビネータのことがでていた。

わかったような、わからないような。。。
なぜ明示的に再帰を使わずに、再帰ができるかの証明がWikipediaに出ていた。

https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF

他のサイトからscriptをコピペして試してみた
<script>
function Y(f) {
  return (function(g) {
    return function(m) {
      return f(g(g))(m);
    };
  })(function(g) {
    return function(m) {
      return f(g(g))(m);
    };
  })
}

var factorial = Y((fact) => {
 return (n) => {
  if (n==0) {
   return 1;
   }else {
    return n*fact(n-1);
    }
    };
    });  
    alert(factorial(4));
</script>

2017年4月11日火曜日

elm使ってみた

 pipeが標準装備されてるようなjavascriptのフレームワークでもないかといろいろ見ていたら、elmという言語を見つける。
 Haskellっぽい言語で、javascriptにコンパイルして使う。
手軽に関数型プログラミングを試せる点では優れものですが、最新情報は英語の資料でみるしかない。signalとやらを 一時期使っていたけど、最新版ではsubscriptionを使うのだとか、変化も激しい。これから注目されそうな発展途上言語といったところでしょうか。

少し試しみた。
 

コンパイラはオンラインのもので
http://elm-lang.org/try
が使える。PCにインストールできない環境でも、上記のサイトでコンパイルして、ソースを表示して、javascriptをコピペして、htmlファイルにしておけば、保管できる。

2017年4月9日日曜日

複雑な条件分岐は、関数型で処理したほうががシンプルになる


元のサイトは
https://medium.com/@chetcorcos/functional-programming-for-javascript-people-1915d8775504で、和訳された方のサイトが
http://postd.cc/functional-programming-for-javascript-people-1/
です。
各関数は1つだけ処理をおこなうので、関数の合成がわかりすい。
これを、if文等で処理するのは、複雑になることが、よくわかります。

pipe は配列にある関数を順に処理する便利な関数ですが、javascriptに標準である関数かと思ったらそうでなく、以下のように簡単に、つくれるということが判明。
よくみたら、上記サイトにも定義されていたのを見逃してしまっていました。
http://javascript-demo.w3c.tokyo/js/status/740

試しに、自分でもつくってみました。関数定義の手間はかかりますが、その分複雑な条件分岐が必要なプログラミングでは威力を発揮しそうです。

2017年4月2日日曜日

関数型プログラミングの基礎 P277

リスト7.91、7.92のmatchiの定義を exp.call(pattern,pattern)から、exp(pattern)にかえてみた。 これでも動くようだが、call(pattern,pattern)を使う意味がいまいちわからない。



2017年3月31日金曜日

関数型プログラミングの基礎 代数的データ構造のmatch関数

scalaにある便利なパタンマッチをjavascriptで実現する方法が書いてあった。

 var empty = () => {
  return (pattern) => {
    return pattern.empty();
  };
};

 var match = (data,pattern) => {
 return data(pattern);
};

 match(empty(),{
  empty: (_)=> {
  return true;
  },
  cons: (head,tail) => {
  ....
  }
});   //ここでは、empty()にマッチして trueが返される。

2017年3月29日水曜日

関数プログラミングの基礎 P67

無限ストリームの例が出ていた。twoStepは任意の関数として、さまざまな無限数列がつくれるということのようです。
var iterate = (init) => {
 return (step) => {
   return [init, (_) => {
     return iterate(step(init))(step);
     }];
    };
   };

   var twoStep = (n) => {
    return n+2;
    };

  var evenStream = iterate(2)(twoStep);
 ただ、ふと、この数列の値はどうやってとりだすのか考えてしまった。
evenStream[1]() 
evenStream[1]()[1]()
evenStream[1]()[1]()[1]()
という具合に、入れ子になった状態のストリームの中身を確かめるしかないのだろうか?
と思っていたら P69にelemAtという要素を求めるために関数が出てきており疑問は解決しました。