関数型について有益そうな情報をまとめてみました。
以下のような流れでした。
今まで学んだ手続き型、オブジェクト指向型とはまったく違っています。よく、頭の中から今まで学んだ概念を捨てて取り組むとありますが、まさにそのとおりでした。自分の率直な感想としては、とても数学的な考えを持ってみると分かりやすいと思います。
関数に対して、データを渡して処理をしてもらうことに変わりはありません。また、関数に対してデータと、そのデータに対して処理を行いたい関数を渡したりもできます。Javascriptの関数オブジェクトやコールバック関数に慣れているとすんなりいくと思います。つまり、関数がデータと同じように第一級であることがわかります。
驚いたことといえば、変数に対する再代入を行わないことです。繰り返しなどの処理を行うときには、indexを使いますが、それを関数の再帰で行うことが多いです。再帰を行うということは、階乗やフィボナッチ数列のように定理や定義によって関数が構成されます。これに対して思ったことは、定理と定義があることにより、とても見通しが良いことでした。if文などによる判断ではなく単純に定理であるためです。if文での判断による定理の実装は行いませんが、論理は存在しますので、ifやswitchのような判断は行えます。このように、定理、定義、命題や論理、さらには数学的帰納法などを思い出しながら関数型に慣れることができました。
また、データに対する型が存在するので、自然と引数・戻り値にも型があることが分かります。つまり、関数にも、引数と戻り値の型によって型が存在することになります。
これら以外に、関数を返す関数やクロージャ、カリー化、部分適用に関数の合成(コンビネータ)など、いろいろな用語がありますが他の記事などを参照してください。
関数型の中には、関数型だけを扱うものとオブジェクト指向も扱うものがあります。Haskellは純粋であり、Scalaは非純粋だそうです。ScalaはJavaのライブラリを使ったり、オブジェクト指向でかけたりします。また、F#という.NET上で動く非純粋な関数型言語もあります。C#に関数型の考えを組み込むのではなく、C#の補完としてF#を使うような関係だそうです。
さらに、型に関しても分別があります。今まであげた言語は静的です。ただし、途中省略しても型推論によって決められることもあるようです。動的な言語には、ClojureやScheme(一部では違うとされている?)があります。静的・動的に関する記事はあまり見ないのであとでまとめてみたいと思います。
かなーり殴り書きですが、こんな感じです。まずはHaskellでHaskellについてではなく関数型についてきちんと学んでいこうと思います。次にScalaなどがなぜオブジェクト指向も取り入れる(ハイブリッド)のかについて調べられたらと思います。最後に、JavaやC#とLLのように、関数型の静的・動的にはそれぞれのどんなメリットがあるかを考えていけたらと思います。一番大切なのは、2番目を知ることで、それを知るために1番目を理解することですね。
botを作ってみようと思ったので、はじめました。
bot用アカウントを作成し、このアカウントにつぶやいてもらいます。
以下の手順で登録します。
完了すると、アプリの詳細が表示されます(Detailタブ)。アプリケーションを削除する場合、Deleteタブから行なってください。
今回は必要ないですがメモしておきます。登録したアプリを不特定多数のユーザが使用するときに必要になります。アプリ詳細画面から下記の2つの内容を控えておきしょう。
どちらもAPIを呼び出す際に使用します。keyは、アプリケーションIDです。secretは、keyを特定するための秘密鍵です。これらと、以下の値を用いて行う認証・認可などについては参考を参照してください。
コンシューマに関する値をリセットするには、Reset keysタブから行なってください。
これはアプリがTwitterに対して行なえる操作(API呼び出し)の種類をしめしています。修正は、Settingsタブから行なってください。
まずは、登録したときにはRead Onlyになっていますので、これをRead and Writeに変更します。これによって、ツイートおよびフォロワー/フレンドの取得以外に「ツイートする/フォローと解除」などが行なえるようになります。
つまり、定期的につぶやいたり、プロフィールに特定のキーワードもつユーザをフォローするようなbotであればWriteもできないといけません。
botのようにアプリを使用するユーザが1つしかない場合、コンシューマで述べた認証や認可といった処理が不要です。よって、Twitterに対するトークンを直接あつかいます。
以下の手順で取得します。
押下後、ボタンの上に下記項目が表示されます。
Access levelはアクセスのときに変更していれば、Read and Writeになっているはずです。これから、上2つの値を使って自分専用のアプリを作っていきます。
バーチャルホストの設定をして、ホスト名ごとにドキュメントルートを変更するようにしました。
nginxが読みこむ設定ファイルのいずれかに以下の設定を追加します。
server {
listen 80;
server_name virtualhost-test.com;
root /var/www/html/test;
index index.php;
access_log /var/log/nginx/test/access.log;
error_log /var/log/nginx/test/error.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
どのサーバーにアクセスされたかを明確にするためにlogの設定も行ないました。touchなどでファイルを作成しておきましょう。また、rootに設定したディレクトリを作成し、適当なphpファイルを格納しておきます。
設定したホスト名でアクセスできるようにhostsファイルに以下の設定を追加します。
xxx.xxx.xxx.xxx virtualhost-test.com
windowsの場合、C:\WINDOWS\system32\drivers\etcにあります。編集後、即時反映されました。
Linuxの場合、/etcにあります。windowsと違って即時反映されません。以下のコマンドを実行して反映します。
service network reload
ipアドレスでアクセスすると、前回設置したphpinfoを出力するページに遷移しました。ホスト名でアクセスすると、用意したファイルの内容が表示されました。また、ログにもアクセス記録が残りました。
Twitterをブラウザで開いているときに、新しいツイートを取得するとタイトルが変更されます。実際に変更してみるとどうなるのか調べてみました。
以下のブラウザで試しました。
開発者ツールなどを使ってタイトルを変更してみた結果、表示されるタイトルも変更されました。たいしたことではないですが、目に付きやすい部分を動的に変えて伝えることを知ることができたので良かったです。
Author:メモの人
自分の気づいたことなどを書くメモ帳(備忘録)です。メモした概要を自分の頭にindexとして残しておいて、参照するちょっと換わった使い方してます。
文章を書く力を身に付けるためのメモ帳でもあります。そのためにcssやhtmlを使用して意味のあるまとまりにできたらなと思います。
また、コメントや疑問がありましたら、気軽にお願いします。人見知りかつ一人が気楽でしたが、いろんな人と交流し楽しく成長できるようにがんばります。
github
Twitter
cloudControl