kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Typed Racketのお勉強 (12)

7 Optimization in Typed Racket

Typed Racketは型の情報を活かして最適化を行います

  • 最適化を止めるには#lang typed/racket #:no-optimizeを使う
  • RealよりもFloatといったように、型を具体的に指定すると効果的
  • リストがnullでないことがわかっている場合は明示してやるとnullチェックが省略される

たとえば整数2個のリストだとわかっていれば

(: sum2 (-> (Listof Integer) Integer))
(define (sum2 l) (+ (car l) (cadr l)))

((Listof Integer)は0個以上のIntegerのリスト)
よりも

(: sum2 (-> (List Integer Integer) Integer))
(define (sum2 l) (+ (car l) (cadr l)))

の方がいいということですね
Vectorも同様
といってもStructでいいケースではStructを使ったほうが適切で速くなります

Typed Racketのお勉強 (11)

6 Typed-Untyped Interaction

Typedじゃない普通のRacketの関数からTyped Racketの関数は普通に呼べます
Typed RacketからRacketの関数を呼ぶにはrequire/typedで型を指定してやります

#lang racket

(provide (struct-out pt)
         distance)

(struct pt (x y))

(define (distance p1 p2)
  (sqrt (+ (sqr (- (pt-x p2) (pt-x p1)))
           (sqr (- (pt-y p2) (pt-y p1))))))

ここで定義されたでdistanceをTyped Racketから呼ぶには以下のように書きます
(chap06-01-distance.rktは上のファイル名)

(require/typed "chap06-01-distance.rkt"
               [#:struct pt ([x : Real] [y : Real])]
               [distance (-> pt pt Real)])

実行

> (distance (pt 3 5) (pt 7 0))
- : Real
6.4031242374328485

自分の作ったファイルだけでなく標準ライブラリからも同様にしてrequire/typedできます

Typed RacketからRacketの関数を呼ぶ場合、Contractを用いて型のチェックが
行われるため、場合によってはオーバーヘッドが発生するので注意、だそうです

娘がもうすぐ小4で入塾テスト受けたりするわけですが
これで実際に授業が始まると夜の8時まで塾とかになるんですよね
自分の小学生の頃を思い出すとこんなんでいいんだろうかという気がしなくもないです
現代の忙しすぎる子供たち、的な
そこまで詰め込んではいないですけど

とはいえそういうことも織り込み済みで決めたことなんで

塾で何を習うというよりもまずは普通に勉強する子供たちの間にいる、っていう
環境が大事かな、と思ってます
朱に交われば赤くなる、ってやつ
いい習慣が自然と身についてくれたらなあと

もちろん今時人気のある塾は考え方とか内容とかもいいと思いますし
先生の教え方もうまいですよね
きっといい感じになってくれるんじゃないかと

でもなんかこう、学校と塾両方ってちょっと大変かなとかもったいないなとか思います
塾に行ってたら学校のこの授業は免除、とかは無理かな
なんか上手くやったら先生も楽になったりしないですかね

TiddlyWiki 5も使ってます

パーソナルではWorkflowy依存ですがお仕事のメモには今TiddlyWiki 5を使ってます
クラウドにデータは置くなってことになってるんで

じゃあOneNote使えよって話ではありますが
どうも生理的に合わないところがありまして
グラフィカルで自由度が高くなるとどうもダメみたいです
ただ字を書くだけの方が楽
OneNoteだって字だけ書けばいいはずなんですけどね
どうもね

じゃあTiddlyWikiはどういうところがいいのかっていうと
上の反対ですべてテキストで書けるってのはあるんですが

何かとプログラマー(じゃないんですけどね)の心を揺さぶるような作り?

TiddlyWikiの記事はTiddlerっていうんですけど

あっちのTiddlerとこっちのTiddlerに同じことを書かなくていいように
Tranclusionっていうしくみを使って引用みたいなことができたりとか

JavaScriptで書かれた小さいコアがあって
あとは拡張スクリプトからタグから設定項目から
全部Tiddlerで書くようになってるとか

当然ながらその結果すごく拡張性が高くて
Wikiの文法までTiddlerで拡張できるとか
Wiki記法があんまり好きじゃなかったらMarkdownで書ける
プラグインなんかもあります(あんまり高機能なMarkdownじゃないけど

どうですか
そそりませんか

あとTiddlyWikiIEさえあれば使えるってところがたまに強みです
つまりまっさらのWindows PCでも使えるってわけです
Officeすら入っていなくても
PCのセットアップなんかするときとか

IEとセットで使うなら.htaにしてしまうのが一番手っ取り早くて便利
TiddlyWikiはブラウザとの組み合わせによって保存が若干面倒になったりしますが
IE+.htaなら何も考えなくてすみます

っていうといつまでサポートされるのって話になりますけどね
うちの会社でIE禁止ってなるのはまあ当分先だと思われますので

Typed Racketのお勉強 (10)

5 Occurrence Typing

Occurrence Typingとはあまり聞き慣れない言葉
さらっとぐぐってみましたがそれっぽい言葉は見つかりませんでした
あまり普及してない概念なのかもしれません
Typed Closureってやつでも出てくるようです

無理に訳そうとせず進みます

なになに
述語の結果によって型をより正確に特定できるとな

(: flexible-length (-> (U String (Listof Any)) Integer))
(define (flexible-length str-or-lst)
  (if (string? str-or-lst)
      (string-length str-or-lst)
      (length str-or-lst)))

str-or-lstString(Listof Any)かどちらかの
型であるというUnion型ですが
(string? str-or-lst)#tを返したならば
str-or-lstString
そうでなければ消去法でstr-or-lst(Listof Any)型だと
特定してくれるってことですね

だからこういうString型しか引数に取らない、または(Listof 何か)しか
引数にとれない関数にも渡せるよ、ってことでいいのかな

> string-length
- : (-> String Index)
#<procedure:string-length>
> length
- : (All (a) (-> (Listof a) Index))
#<procedure:length>

Occurrence Typingがない言語だとこういうのはどうなるんだっけ?
そもそも文字列型か何かのリストかどちらかを取る値っていうのも
めずらしい気がする、っていうか設計がおかしいかも、って思うかもだなあ

Typed Racketのお勉強 (9)

4 Types in Typed Racket (続き)

もうちょっと調べないともやっとするな・・・

前回よくわからなかったのがこれ
B ... BのふたつめのBがどうして必要なのかわからない

(: fold-left
   (All (C A B ...)
        (-> (-> C A B ... B C) C (Listof A) (Listof B) ... B
            C)))

1.6 Other Type Constructors  にそれっぽいのを発見

Rest argumentsに異なる型が含まれるケースはこれにあたる

(-> dom ... rest ooo bound rng)

rest oooの部分がRest Arguments
oooっていうのは単に...という文字のこと
つまりrest ooo boundB ... Bに対応してるってことになる
定義上はふたつめのB(か、すくなくともそこに何か)が必要っぽい

説明

... the third form specifies a non-uniform rest argument of type rest with bound bound. The bound refers to the type variable that is in scope within the rest argument type.

何を言っているのかよくわからない
わからないけどわからないまま日本語に直してみる

3番目のフォーム(上に引用したやつ)は rest型の一様でないrest argumentをboundにバインドするよう指定する。このバインドはrest argumentの型のスコープ内にある型変数を参照する。

うんやっぱりわからない
ふたつめのBがなくてもB ...だけでもわかるんじゃないの?

わからないのでふたつめのBDに変えてみたりとか

(: fold-left
   (All (C A B ...)
        (-> (-> C A B ... D C) C (Listof A) (Listof B) ... D
            C)))

これはエラー

Type Checker: parse error in type;
 used a type variable not bound with ... as a bound on a ...
  variable: D in: (-> (-> C A B ... D C) C (Listof A) (Listof B) ... D C)

「...にバインドされてない変数を...へのバインドとして使った」てことですかね
B...にバインドされるんだということはわかった

ふたつめのBを消してやっても動くし
上の定義にしたがえば、これはCboundに対応して
関数の値の型がなくなってしまうはずなんだけどどうなってるの

(: fold-left
   (All (C A B ...)
        (-> (-> C A B ... C) C (Listof A) (Listof B) ...
            C)))

型を見てみる

> fold-left
- : (All (C A B ...) (-> (-> C A B ... B C) C (Listof A) (Listof B) ... B C))
#<procedure:fold-left>

ふたつめのBが補完されてるし
型推論のおかげかな

B以外に書けないし書かなくてもBが補完されるなら
どうしてBを書かなきゃいけないの
そしてBにバインドしてそれをどうするの

(All (a ... a ooo) t)

こっちは単に型tをパラメータ化したもの、というだけしか書いてない

うーん

NHK GJ

今日はNHK精霊の守り人の特集みたいなのやってましたね

上橋菜穂子の本を読んだのはごく最近、しかも守り人シリーズじゃなくて
獣の奏者の方だったりするんですけど
このひとの書いたものなら間違いないっていう感覚です(何様

精霊の守り人シリーズはとりあえず精霊の守り人だけ軽装版を買ってあったんで
あやせはるか、びじんーーーっていう反応を見てすかさず
ほらウチにもあるよ、と言って渡してあげたらけっこう食いついてました

本当の狙いは上橋菜穂子じゃなくて
モモとかはてしない物語を読んでもらうことなんですけど
まずはお姫さまが主人公じゃないファンタジーに慣れさせることかなあ、と思って

獣の奏者は全巻あるんですがちょっとまだ早いかなあ
読むならもうなんだっていいと思ってたりするんですが
きっかけがあれば何でも読みそうなんで