23122009 伊豆
師走の西伊豆で『小あじ鮨』そして『潮かつお』で潮かつおなるものを知った。小あじ鮨は存在を知っていたがいつもスルーしてたので、この機会にちょっと行ってみた。

小あじ鮨とカサゴ汁

地物のにぎり盛り合わせ(海老は手長海老)

潮かつおは丸々一匹でなくて半身のモノしかなかったが、とりあえず食べてみたかったので買えて満足。あと、かつおの塩辛も買った。
23122009 伊豆
師走の西伊豆で『小あじ鮨』そして『潮かつお』で潮かつおなるものを知った。小あじ鮨は存在を知っていたがいつもスルーしてたので、この機会にちょっと行ってみた。

小あじ鮨とカサゴ汁

地物のにぎり盛り合わせ(海老は手長海老)

潮かつおは丸々一匹でなくて半身のモノしかなかったが、とりあえず食べてみたかったので買えて満足。あと、かつおの塩辛も買った。
21122009 長泉
知り合いに出産祝いを届けに長泉にいったので、お昼はクレマチスの丘で。



カレーもうまかったが、子供用の野菜たっぷりドリアが良かった。カレーの辛さは3歳の娘でもバクバクいけるくらいの辛さだったので、辛さは僕にはちょっと物足りなかったけど。
20122009 life
「人を励ますのが苦手な人」なので読んだ。
19122009 Haskell
最初
simpleHTTP (getRequest "http://www.haskell.org/")
みたいに書けばいいので簡単だと思ってたのだけど、リクエストにBasic認証のヘッダを含める方法がわからなくてRequest型を作るのにCodec.Binary.Base64.String入れるはめになった。postRequestで組み立てられると思うんだけど。
import Network.HTTP
import Network.URI
import Codec.Binary.Base64.String
import Data.Maybe
tweet msg = simpleHTTP req where
req = Request uri POST [ah] "" where
ah = Header HdrAuthorization $ "Basic " ++ encode "user:pass"
uri = fromJust $ parseURI $ "http://twitter.com/statuses/update.xml?"
++ urlEncodeVars [("status", msg)]
17122009 Haskell
構成子関数は評価済みであり、それ以上簡約できないとはどういうことなんだろうか?
data MyAdd = MyAdd {ev :: (Int -> Int)}
これはIntをとってIntを返す関数を表す型
*Main> let add5 = MyAdd (\n -> n + 5)
*Main> :t add5
add5 :: MyAdd
MyAdd型ってなっててこれ以上簡約できない。でも実態はラムダ式なんでしょってことで、Intを渡すとエラー
*Main>add5 3
<interactive>:1:0:
Couldn't match expected type `t1 -> t'
against inferred type `MyAdd'
In the expression: add5 3
In the definition of `it': it = add5 3
evアクセサをつかってアクセスする。
*Main> ev add5 3
8
要するに型とは簡約のレベル(深さ)を定義するってこと?
構成子関数はこういう型だと認識して納得。その後TLを追いかけ直して、理解した。
MyAdd :: (Int -> Int) -> MyAdd
よくよく考えてみるに、僕はこの右辺を(Int -> Int)という(ラムダ関数みたいなもの)にMyAddっていうラベルをつけるみたいなイメージを漠然と持っていたようです。
data MyAdd = MyAdd (Int -> Int)
で、
let add5 = MyAdd (\n -> n + 5)
とやると(MyAdd型にラベル付けされた)関数に束縛されたadd5っていう変数が生まれると。 だから型で一時停止してその先には(\n -> n + 5)っていう関数が待っているのかなぁつまり、
型とは簡約のレベル(深さ)を定義するってこと?
という、冒頭のような勘違いをしていた。
型とは新規な器みたいなものだと捉えられるようになったら、下の話も理解できた。
@kzfm うーん、うまく説明できないんですが、そもそも単なる別名になってほしくないからnewtypeを使っていて、別名になってほしいならtypeを使うと思うんです。だから、Parse型の値に引数を適用できないのは、そのほうが型チェックの恩恵を受けれるからだと思います。
@kzfm newtypeは結果的に一個の型に別名をつけるだけに見えてしまうのでtype文に似てるように思ってしまうのですが、むしろdata文の特殊な形と思った方がいいと思います
Real World Haskell―実戦で学ぶ関数型言語プログラミングSICPの2.2.1章の「並びの表現」っていうところを読んで、carとかcdrのでリストを表現の仕方を学んだ。
これ読んでhaskellのアレが理解できた。アレってばhaskellの:演算子のこと。
[1,2,3]
= 1 : [2,3]
= 1 : 2 : [3]
= 1 : 2 : 3 : []
最初普通のhaskellプログラミングを読んだときにはよくわからなかったけど、carとcdrが理解できた今ならこれって凄く自然に思えてくるのが不思議。
それにしても、SICPおもしろいなぁ。なかなか進まないけど。
お盆なんでU隊長の実家にいったんやけど、やることないのでSICP読みながら遊び中。
haskellの
[1,2,3]
= 1 : [2,3]
= 1 : 2 : [3]
= 1 : 2 : 3 : []
は、gaucheで
(list 1 2 3)
= (cons 1 (list 2 3))
= (cons 1 (cons 2 (list 3)))
= (cons 1 (cons 2 (cons 3 '())))
カッコがないほうがわかりやすいナァ(ボソッと)。
非決定性計算とかambでどんづまり。なんか色々みているうちにうっかりモナドに迷い込んでしまった。
我々の課題を思い出してください:「副作用付き計算を、純関数で表現せよ」でした。カウンター(大域変数count)に触ることは副作用ですから、これをやめましょう。んじゃ、カウントアップできないじゃないか! って?はい、そのとおり。でも、「カウントアップしたい」という意志を伝えることはできます。
結局Monadを実装するためには、値と副作用を別々に保持し、値に関しては参照等価性を保ちさえすればいい。
$op0->{value} = eval{
$coderef->($op0->{value}, $op1->{value});
};
if ($@){
$op0->{state} = $@;
$op0->{value} = undef;
}
evalで「失敗するかもしれない演算」を包んで「より大きな失敗するかもしれない演算」を作るって解釈すればよいのかな。
あとでふつうのHaskellプログラミング読み返そう。
現実逃避もかねて、どう書く?解いてた。
Higher-order Perlのおかげでこんな感じの問題は、まず再帰で考えることができるようになった気がする。
Higher-Order Perl: Transforming Programs with Programsそれにしても、haskellの二行ってすごいなぁと思った。