一の谷 純

ぬる燗にするとすこぶる旨い。

1261311626

ひたすらぬる燗、冷はなしで飲みきった。

HaskellのsplitAt

HaskellのsplitAtはなんでタプルを返すんだろうか?

Prelude> :t splitAt
splitAt :: Int -> [a] -> ([a], [a])
Prelude> splitAt 3 [1,2,3,4,5]
([1,2,3],[4,5])

pythonで同じようなのを書いてみる。

>>> def splitAt (n,xs): return [xs[:n],xs[n:]]
... 
>>> splitAt(3,[1,2,3,4,5])
[[1, 2, 3], [4, 5]]
>>> def splitAt (n,xs): return (xs[:n],xs[n:])
... 
>>> splitAt(3,[1,2,3,4,5])
([1, 2, 3], [4, 5])

なんというか[[1, 2, 3], [4, 5]]のほうが見た目よろしい気がするのです。

追記09.12.25

gawaのパーティパック

今年もgawaのパーティパックでクリスマス。

1261654887 1261654873

娘が何故かピザ焼いてた。

1261654866 1261654881

今年もそろそろ終了。来年はどうしようかな。

「Essential Sqlalchemy」届いた

あとで読む。

ProductName Essential Sqlalchemy
Rick Copeland
Oreilly & Associates Inc / ¥ 3,267 ()
通常2~4週間以内に発送

正月魚を求めて田子に行ってきた

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

1261565758

小あじ鮨とカサゴ汁

1261565778 1261565772

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

1261565784 1261565766

潮かつおは丸々一匹でなくて半身のモノしかなかったが、とりあえず食べてみたかったので買えて満足。あと、かつおの塩辛も買った。

ProductName 伊豆 (ことりっぷ)

昭文社 / ¥ 840 ()
在庫あり。

クレマチスの丘

知り合いに出産祝いを届けに長泉にいったので、お昼はクレマチスの丘で。

1261311832 1261311839

1261311856 1261311826

1261311844 1261311850

カレーもうまかったが、子供用の野菜たっぷりドリアが良かった。カレーの辛さは3歳の娘でもバクバクいけるくらいの辛さだったので、辛さは僕にはちょっと物足りなかったけど。

雨後の月

ヨコゼキさんで。

1261311619

「人を励ますのが苦手な人のための50の簡単な方法」を読んだ

「人を励ますのが苦手な人」なので読んだ。

ProductName 人を励ますのが苦手な人のための50の簡単な方法
C・E・ローリンズ
ディスカヴァー・トゥエンティワン / ¥ 1,365 ()
在庫あり。

  • あなたの役割は、相手が人生の試練を避けるのを手伝うことではなく、相手に人生の試練に立ち向かう勇気を与えることです
  • 短所ではなく長所を認め、失敗ではなく成功に注目する
  • 人間関係を発展させる最高の方法のひとつは、絶えず相手に感謝の気持ちを伝えること
  • ヒトの紹介
    • 相手が手伝ってくれた事柄を指摘する
  • 励ましはシーソーに似ている
    • 相手とのバランスが重要

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)]

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

要するに型とは簡約のレベル(深さ)を定義するってこと?

追記 091217

構成子関数はこういう型だと認識して納得。その後TLを追いかけ直して、理解した。

MyAdd :: (Int -> Int) -> MyAdd

確かに、いろいろ入り混じって混同してました

よくよく考えてみるに、僕はこの右辺を(Int -> Int)という(ラムダ関数みたいなもの)にMyAddっていうラベルをつけるみたいなイメージを漠然と持っていたようです。

data MyAdd = MyAdd (Int -> Int)

で、

let add5 = MyAdd (\n -> n + 5)

とやると(MyAdd型にラベル付けされた)関数に束縛されたadd5っていう変数が生まれると。 だから型で一時停止してその先には(\n -> n + 5)っていう関数が待っているのかなぁつまり、

型とは簡約のレベル(深さ)を定義するってこと?

という、冒頭のような勘違いをしていた。

型とは新規な器みたいなものだと捉えられるようになったら、下の話も理解できた。

mzp

@kzfm うーん、うまく説明できないんですが、そもそも単なる別名になってほしくないからnewtypeを使っていて、別名になってほしいならtypeを使うと思うんです。だから、Parse型の値に引数を適用できないのは、そのほうが型チェックの恩恵を受けれるからだと思います。

koyama41

@kzfm newtypeは結果的に一個の型に別名をつけるだけに見えてしまうのでtype文に似てるように思ってしまうのですが、むしろdata文の特殊な形と思った方がいいと思います

ProductName プログラミングHaskell
Graham Hutton
オーム社 / ¥ 2,940 ()
在庫あり。

ProductName Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan,John Goerzen,Don Stewart
オライリージャパン / ¥ 3,990 ()
在庫あり。