リスト7.91、7.92のmatchiの定義を exp.call(pattern,pattern)から、exp(pattern)にかえてみた。
これでも動くようだが、call(pattern,pattern)を使う意味がいまいちわからない。
2017年4月2日日曜日
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が返される。
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という要素を求めるために関数が出てきており疑問は解決しました。
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という要素を求めるために関数が出てきており疑問は解決しました。
2017年3月28日火曜日
関数型プログラミングの基礎
javascriptでも関数型プログラミングができるということで、上記の書籍を読んでみた。
さっそく、リスト2.4で 少し混乱する。
var get = (key, obj) => {
return obj(key);
};
var set = (key, value, obj) => {
return (key2) => {
if(key === key2) {
return value;
} else {
return get(key2,obj);
}
};
};
var ob;
ob=set('a',1,ob); 1
ob=set('b',2,ob); 2
などと試し見た。
get('a',ob);
1
get('b',ob);
2
と、確かにできた。
1ではob('a')が1へ対応する関数
(key2) => {
if ('a'===key2) {
return 1;
} else {
return ob(key2);
}
};
}; ができて
2ではob('b')が2へ対応する関数
(key2) => {
if ('b'===key2) {
return 2;
} else {
return ob(key2);
}
};
};
ここのob(key2)は
ob('a')が1へ対応するもの、つまり1の関数がきている
これを再帰的に繰り返しているということだろうか?
さっそく、リスト2.4で 少し混乱する。
var get = (key, obj) => {
return obj(key);
};
var set = (key, value, obj) => {
return (key2) => {
if(key === key2) {
return value;
} else {
return get(key2,obj);
}
};
};
var ob;
ob=set('a',1,ob); 1
ob=set('b',2,ob); 2
などと試し見た。
get('a',ob);
1
get('b',ob);
2
と、確かにできた。
1ではob('a')が1へ対応する関数
(key2) => {
if ('a'===key2) {
return 1;
} else {
return ob(key2);
}
};
}; ができて
2ではob('b')が2へ対応する関数
(key2) => {
if ('b'===key2) {
return 2;
} else {
return ob(key2);
}
};
};
ここのob(key2)は
ob('a')が1へ対応するもの、つまり1の関数がきている
これを再帰的に繰り返しているということだろうか?
2017年3月25日土曜日
二次方程式を解く javascript
javascriptの勉強のためにつくってみた。
利用させていただいたサイト
https://www.mathjax.org/
http://d.hatena.ne.jp/kochann/?of=6
問題を乱数で出題するようにしています。
.netなどでつくるより、つくりやすいところとそうでないところがあり、一長一短があるような気がします。
javascriptは、型の定義の融通がきく半面、何の型なのか常に意識する必要はあるようです。画面上の細かい調整にいまいち慣れてないので、レイアウトでけっこう時間がかかってしまいます。あと、^2など2乗の計算を認識しない?ようです。*+-は大丈夫なようですが。
さまざまなパータンの二次方程式に対応させるため、だいぶ長くなってしまいました。
2017.5.9 bug fix 有理数解のときのメッセージ表示に不具合あったものを修正しました。
github pagesで公開してみました
https://gh6141.github.io/gitdrill/nijihote.html
利用させていただいたサイト
https://www.mathjax.org/
http://d.hatena.ne.jp/kochann/?of=6
問題を乱数で出題するようにしています。
.netなどでつくるより、つくりやすいところとそうでないところがあり、一長一短があるような気がします。
javascriptは、型の定義の融通がきく半面、何の型なのか常に意識する必要はあるようです。画面上の細かい調整にいまいち慣れてないので、レイアウトでけっこう時間がかかってしまいます。あと、^2など2乗の計算を認識しない?ようです。*+-は大丈夫なようですが。
さまざまなパータンの二次方程式に対応させるため、だいぶ長くなってしまいました。
2017.5.9 bug fix 有理数解のときのメッセージ表示に不具合あったものを修正しました。
github pagesで公開してみました
https://gh6141.github.io/gitdrill/nijihote.html
2017年3月14日火曜日
javascript でクラスを使ってみる
canvasという便利な図形表示の仕組みがいつのまにか
使えるようになっている。これをオブジェクト指向で(クラスで)使ってみた。
クラスを使わないと、ちょっと複雑になると、手に負えなくなりそうだ。
ドラッグ&ドロップをしてみたかったので、まずこちらを参考にさせていただいた。
http://qiita.com/kyrieleison/items/26fcfb3a1d94bc92c596
さっそく、イベントの追加でthisの使い方がわからず悩む
がhttps://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
に解決方法がかいていあった。
力の合成を表すものですが、矢印は
http://qiita.com/frogcat/items/2f94b095b4c2d8581ff6
の中のライブラリをつかわせていただきました。
それを参考に少しためしてみたのが、以下のソース
力の分解のほうは、継承を使ってみました。もう少し簡潔にできそうですが。
使えるようになっている。これをオブジェクト指向で(クラスで)使ってみた。
クラスを使わないと、ちょっと複雑になると、手に負えなくなりそうだ。
ドラッグ&ドロップをしてみたかったので、まずこちらを参考にさせていただいた。
http://qiita.com/kyrieleison/items/26fcfb3a1d94bc92c596
さっそく、イベントの追加でthisの使い方がわからず悩む
がhttps://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener
に解決方法がかいていあった。
力の合成を表すものですが、矢印は
http://qiita.com/frogcat/items/2f94b095b4c2d8581ff6
の中のライブラリをつかわせていただきました。
それを参考に少しためしてみたのが、以下のソース
力の分解のほうは、継承を使ってみました。もう少し簡潔にできそうですが。
2017年3月12日日曜日
ubuntuでcifs マウント
起動時にマウントする方法
/etc/fstabに以下を追加
//192.168.1.?/share /mnt/windows/ cifs username=user,password=,uid=1000,gid=1000 0 0
パスワード不要なら省略できるようだ。
以前はシェルスクリプトをサービスとして起動する方法でやってきたが、それだと
sleep等を使って、遅延させる必要があった。
fstabに登録する方法があるとは知らなかった。
参考リンク
http://engetu21.hatenablog.com/entry/2016/07/31/190059
/etc/fstabに以下を追加
//192.168.1.?/share /mnt/windows/ cifs username=user,password=,uid=1000,gid=1000 0 0
パスワード不要なら省略できるようだ。
以前はシェルスクリプトをサービスとして起動する方法でやってきたが、それだと
sleep等を使って、遅延させる必要があった。
fstabに登録する方法があるとは知らなかった。
参考リンク
http://engetu21.hatenablog.com/entry/2016/07/31/190059
登録:
投稿 (Atom)