トップ «前の日記(2009-10-20) 最新 次の日記(2009-10-22)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|

ToDo:


2009-10-21

_ 対関数

sin-x さんに教えてもらう。

http://ja.wikipedia.org/wiki/対関数

よく整数2つの点とかの hash 値をどう計算するか悩むわけなんだけど、 本質的にこの関数はちょっと遅そうだけど、悪くないかも、ね。

ちょっとやってみた。 適当な値域の乱数のペアを大量に作って適当に突っ込む。

http://github.com/shinh/test/blob/da1e28b9fd201ca2d203d3e187cc280e9a8b9f9a/bijection_hash.cc

ハッシュ関数としては単なるかけ算、 よくある x + y * prime みたいなヤツ、 それとこの対関数、をそれぞれ使ってみた。

bijection_hash.gif

最初の立ち上がり部分は値域がほぼ埋まってるのであんまり関係ない。

  • 単なるかけ算は明らかに悪い。
  • 対関数は密度がある程度あるうちは衝突が少ないおかげかちょっと早そう。
  • 密度が薄くなると普通のやつに比べてたぶん hash の計算自体が遅いのでキツい。

て感じですかね。

(00:10)

_ smjs のクソ仕様

http://shinh.skr.jp/m/?date=20070219#p01

の時書いてたやつはいつのまにかなおってるぽいかな。

(03:16)

_ SVNSearch

http://svnsearch.org/svnsearch/repos/WEBKIT/search?start-index=20&logMessage=hamaji

これをみるとパッチ数がわかるうえに なんかかっこいいグラフとかがついてていいみたいだ。

Chromium の方はコミッタになる前のが入らんのが微妙ね。 9月ゼロってすごいな

http://tinyurl.com/yj2la4v

(04:33)

_ failwithf

http://d.hatena.ne.jp/camlspotter/20091020/1256049332

via http://twitter.com/chunjp/status/5021818819

これ全然動かないのはなぜなんだろう…

let failwithf fmt = Printf.kprintf (fun s -> failwith s) fmt;;

に変えたらうごいた。 ああ第一引数が (string -> 'a) だから (fun s () -> failwith s) でも unit を取る関数が帰ってるってことなのか。

てことはこう使うの?

let failwithf fmt = Printf.kprintf (fun s () -> failwith s) fmt;;
(failwithf "hoge: %s" "hii") ();;

うーんこれ何が嬉しいんだろう。

あと fmt が両辺にある理由もよくわからん。 単に

let failwithf = Printf.kprintf (fun s -> failwith s);;

じゃだめななにかがあるんかなぁ。

(10:54)

本日のツッコミ(全5件) [ツッコミを入れる]
_ kinaba (2014-05-24 01:31)

let failwithf = Printf.kprintf (fun s -> failwith s);;
だと failwithf が多相型にならないので
failwithf "foo"; failwithf "bar%d" 100;; (* 2個目のfailwithfで型エラー *)

let failwithf fmt = Printf.kprintf (fun s -> failwith s) fmt;;
failwithf "foo"; failwithf "bar%d" 100;; (* ok *)

_ shinh (2014-05-24 01:31)

ううむありがとうございます。インタプリタだと通ったので通るんじゃね? と思ってしまってました。たしかにコンパイラだと怒りますね。

しかしなんでダメなのかの理屈は正直よくわかりません…インタプリタに型を聞くと、

# let failwithf fmt = Printf.kprintf (fun s -> failwith s) fmt;;
val failwithf : ('a, unit, string, 'b) format4 -> 'a = <fun>
# let failwithf = Printf.kprintf (fun s -> failwith s);;
val failwithf : ('_a, unit, string, '_b) format4 -> '_a = <fun>

とか言われて僕には同じに見えるのですが、 'a と '_a は違うものなのか、それともそもそもインタプリタなのでコンパイラと動作が違うのか…

_ jijixi (2014-05-24 01:31)

'a と '_a は違うものです。
それぞれの関数を一回使った後に型がどうなってるか確かめてみるとわかるかと

_ mame (2014-05-24 01:31)

value restriction とか言われます。
http://ftp.yl.is.s.u-tokyo.ac.jp/~oiwa/lecture/ocaml/2001/misc/valuerestriction.pdf

_ Waecnhro (2014-05-24 01:31)

この間も俊太郎の詩をお http://www.stlouisbusinesslist.com/business/5021837.htm?info=viagra generic viagra >:[[[

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

2009年
10月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
1.shinh(2014-05-24 01:31) 2.ょゎ(2014-05-24 01:31) 3.shinh(2014-05-24 01:31)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h