Haskellで関数は型、値コンストラクタは関数だとすると関数型の値コンストラクタって何?

朝カットに行って髪を切ってもらっている間、タイトルのようなことを考えていた。

Prelude Control.Arrow> :i (->)
data (->) a b   -- Defined in `GHC.Prim'
Prelude Control.Arrow> :k (->)
(->) :: * -> * -> *

であり、(->)は型として定義されている。すごいHaskell(p.232)の言葉を借りれば、適用しろという文脈の着いた型と考えればいいんだろう。

部分適用((->) r)のfmapは(.)なので関数合成なんだが、そういえばArrowか?などとControl.Arrowを探索しはじめた。

Prelude Control.Arrow> :i (.)
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in `GHC.Base'
infixr 9 .
Prelude Control.Arrow> :i (>>>)
(>>>) ::
  Control.Category.Category cat => cat a b -> cat b c -> cat a c
    -- Defined in `Control.Category'
infixr 1 >>>
Prelude Control.Arrow> :i (<<<)
(<<<) ::
  Control.Category.Category cat => cat b c -> cat a b -> cat a c
    -- Defined in `Control.Category'
infixr 1 <<<

というわけで、(.)と(<<<)は同等のものかな。

(.) :: (b -> c) -> (a -> b) -> a -> c

これは部分適用((->) r)を使えば

(b -> c) -> ((->) a b) -> ((->) a c)

結局(->)をcatに書き換えれば同じ物ができる。そういうあたりから考えるとArrowは関数合成を拡張(一般化?)したものと考えればいいのかなぁ。

とか考えていくうちに関数型の値コンストラクタって一体なんじゃろかねーという疑問が湧いてくるわけで。

14章で状態付きの計算をやったときとかのStateモナドはrunStateで計算をはしらせたけど、関数型はそういうのがないからなぁ、適用しろっていう文脈を持った型なのに、じゃぁどのタイミングで適用すんのよ?とよく分からなくなってきた。

暗黙的な何かなのか、それともそもそも自分の理解がどこか間違っているのか?

ProductName すごいHaskellたのしく学ぼう!
Miran Lipovača
オーム社 / 2940円 ( 2012-05-23 )


120611 追記

値コンストラクタと型コンストラクタをきちんと理解してなかった。型コンストラクタの型変数は引数として取るものだと思っていたが、単に型変数を表しているだけなのね。

data Maybe a = Nothing | Just a     -- Defined in `Data.Maybe'
data Either a b = Left a | Right b  -- Defined in `Data.Either'

なんだけど

read :: Read a => String -> a

見たら、なんか間違っていたと理解した。

それから、RWHのp.228

type InfoP a = FilePath
                   -> Permissions
                   -> Maybe Integer
                   -> ClockTime
                   -> a

デザインのための数学

黄金比だけでなく白銀比があるというのは知らなかったし、白銀比とA4やB5の話が面白かった。

ProductName デザインのための数学
牟田 淳
オーム社 / 2310円 ( 2010-10-23 )


数学とは直接関係ないのだが、割れにくいシャボン玉液の比率は参考になった。

内容はちょっとデザインよりかな。twitter の新ロゴデザインが美しすぎて調べてみたら、黄金比で構成されてた。なんかに興味があれば読んでみればいいんじゃないでしょうかね。

今日の畑(120606)

コンパニオンプランツということで、サツマイモの畝に枝豆の種をまいてみた。で、ナスの畝にはつるなしインゲンを。

1339286165

結局失敗した大根だが、風で飛ばされて畝から外れた大根が何故か育っている。

1339286170

1339286168

大根は秋にもう一度チャレンジだな。

MongoDB & Pythonを読んだ

Haskellのwebフレームワークyesodでもmongodbが使えるし 、今作ろうと思っているウェブアプリにMongoを使ってみようかなぁと思っていたので、MongoDB & Pythonを買って読んでみた(readiumってのを使ってます)。

MongoDB & Python

入門的な内容なんだけど、3章のMongoDBとPythonの頻出パターンは参考になった。

  • ドキュメント指向にユニークなパターン:埋め込み
  • 高速ルックアップ:MongoDBでインデックスを使う
  • 位置情報アプリとMongoDB:地理空間インデックス
  • ディフェンシブなコーディングでKeyErrorやその他のバグを防ぐ
  • 更新または挿入:MongoDBのアップサート
  • アトミックな読み書き変更を行う:MongoDBのfindAndModify
  • 高速アカウンティングパターン

特にupsertの書き方(find_or_insertとか、insert_or_update)がいまいちわかっていなかったけど本書を読んだらすっきりしたので、これで気持ちよく書けそう。

あとはオフィシャルサイトのマニュアル(日本語訳)でも読めばいいかな。

スケーリングMongoDBも読んでみたいが使う場面がないのでとりあえずは後回し。

FlaskでBDD(ブラウザUIテストの話)

MLに「FlaskでBDDやってる?」っていうスレッドが流れてて、2つのやり方が紹介されてた。僕は家庭菜園をやっている関係上、lettuceを選択せなあかんわなというわけで、あまり検討しないで、lettuceを使うことに決めた。

lettuceを使う方法

pyccuracyを使う方法

2つの違いはなんなの?ってあたりが気になるのだけどこれもsofにあった。

要するにpyccuracyはブラウザでのテストに特化しているがlettuceはもうちょっと汎用的な使い方ができる。実際にlettuceでselenium使いたい場合はlettuce_webdriverっていうプラグインみたいなのを別途導入する必要がある。

一方で、共通しているのはGherkin DSLを使っているということで、確かlettuceはcucumberのpythonポーティングだったから、そっちでググれば日本語の情報が出てくる。

lettuceを使ってみる。

featuresっていうディレクトリを作って、そこにテスト用のファイルを置く。 ディレクトリの構成はこんな感じ。

.
└── features
    ├── steps.py
    └── web.feature

web.feature

featueは普通に文章を書いているようで何をしたいかがわかりやすく表現できる。

Feature: Compute factorial
    In order to play with Lettuce
    As beginners
    We'll access google

    Scenario: Filling out the query form
      Given I go to "http://www.google.com"
       When I fill in "q" with "Hello World"
        And I press "btnG"
       Then I should see "Hello World"

steps.py

stepsはモジュールの設定とか色々やるみたいなんだけど、今回はwebdriverのほうに定義されているもの しか使わないのであまり書くことがない。

from lettuce import before, world
from selenium import webdriver
import lettuce_webdriver.webdriver

@before.all
def setup_browser():
    world.browser = webdriver.Firefox()

実行してみる

実行するとseleniumパワーでブラウザが立ち上がり、テストが実行され結果が端末に表示される。テスト結果はカラー表示で分かりやすい。

lettuce webdriver

Spine.jsやBackbone.jsなんかのクライアントサイドMVCのテストとかにも向いてるのかな?今度調べる。

おもてなしの経営学 アップルがソニーを超えた理由

面白かった。

古川さんの「上を見て」仕事をするタイプと「天を見て」仕事をするタイプという話が心に残った。

梅田望夫さんの対談で出ていたような、お墓の永代供養料のようなブログサービスというようなサービスは必要だろうなぁとおもう。

僕の中ではやっぱjoyride in high gearかなぁ。

でも更新しないと検索エンジンの順位がだんだん下がっていってヒットしにくくなっちゃうんだよねー

mochaでBDD

ちょっと前にTest Driven Development with a Node.js TCP Server?っていう質問を見つけて、コメントにmocha使えやって書いてあったのでmochaが気になっていた。

ちょっとドキュメントみたんだけど、jasmineみただなぁと。それからいまいち良さが伝わってこない。vowsでいいじゃんと。

もうちょっと探したら、同じようにvowsから移行しようかなぁっていう質問もみつけた。

Should I switch from Vows to Mocha?

done callbackがいいらしいが。

なにかで使ってみないとわからんなぁ。

ProductName テスト駆動JavaScript
Christian Johansen
アスキー・メディアワークス / ?円 ( 2011-11-25 )


Jadeで要素のないiterator(list)の判定

フィードのエントリを表示することを考える。そうするとエントリ数が0の時になにか表示しないといけないが、Jinja2だとfor-else構文があるのだけどjadeではないっぽい。

なので、先頭のエントリがあるかないかで条件分岐させるというテンプレートを書いたんだけど、見た目が悪いというかなんかださい

  if entries[0]
    for e in entries
      h3 #{e.title}
      p #{e.summary}
  else
    h2 no entries

もうちょっと綺麗な書き方はあるんだろうか?

Express+now.js+coffeescriptでつくるお絵描きwebサービスをherokuにデプロイ

今月末にやるハンズオンのサンプルを作りました。興味があったら是非参加してください。そしてNode.jsについて熱く語り合いましょう、さらにその勢いでHaskell+yesodを誰か僕に教えてください。

どんなものをつくるのかはherokuにデプロイしておいたので参考にしてください。コードはGithubです。

テストのために今朝ちょいとtwitterで「書いてみて」ってお願いしたら、こんなにたくさんの画伯が描いてくれました。感謝。

shizdraw

さて、ハンズオンの流れ的には、

  • @k0sukeyが、node.jsインストール、hello worldからherokuデプロイとsoket.ioの触りまでっていう導入的な内容
  • @ksmakotoのwebsocketとnode.jsのHTTPサーバーなんかを低レイヤー寄りのスタンスで書いていくっていう内容
  • 僕が、抽象度の高いライブラリを使ってウェブサービスを作ってみるっていう内容。私のサンプルでは通信部分が3行くらいに収まっています(now.js最高ですね!)。

あとは、サーバーサイドな内容(EventEmitterまわりかな?)が一本入る予定になっています。楽しみですね。

次の日には浜松で浜松 Titanium Mobile 勉強会があるので、土曜はしぞーかおでんを(イベントドリブンで)食べつつ、日曜は浜松でひつまぶしつつTiっていう小旅行勉強会的な何かもいいんじゃないかなー

浜松行きたいんだけどなー

Introduction to Information Retrieval(IIR)の日本語版

Introduction to Information Retrievalの日本語版が出版されるようなので予約してみた。

ProductName 情報検索の基礎
Christopher D.Manning
共立出版 / 8400円 ( 2012-06-23 )