• Like
PFDS 10.1.1 多相再帰
Upcoming SlideShare
Loading in...5
×

PFDS 10.1.1 多相再帰

  • 382 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
382
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. PFDS 10.1.1 多相再帰 Kiwamu Okabe
  • 2. 多相再帰って何?再帰を一つ進める前と後とで型が異なること。datatype a Seq = NIL | CONS of a * (a * a) Seqfun sizeS NIL = 0 | sizeS (CONS (x, ps)) = 1 + 2 * sizeS pssizeS関数の型は...☆ 左辺 => sizeS: a Seq -> int☆ 右辺 => sizeS: (a * a) Seq -> int
  • 3. SMLで書きたい...んだけどPFDSによるとStandard MLでは...☆ 多相的なデータ型を定義することは可能☆ 多相再帰を書くことは不可能SML# や SML/NJ はどーなのか気になりますね。 (すいません試してないです)
  • 4. 多相再帰=>単相再帰datatype a Seq = NIL | CONS of a * (a * a) Seq↓単相へ変換datatype a EP = ELEM of a | PAIR of a EP * a EPdatatype a Seq = NIL | CONS of a EP * a Seqのように多相再帰=>単相再帰への変換が必ず可能です。
  • 5. それなら全部単相再帰で書くべき?それはもったいない!☆ 多相にすれば型宣言を2つ=>1つに削減できた☆ a EP型へのパターンマッチが不要で、そのコンストラクタをメモリに置く必要がない☆ 多相にすれば、Seqの段数とペアの数が一致することを型が保証してくれる
  • 6. OCamlだとtype a my_seq = Nil | Cons of a * (a * a) my_seqlet rec sizeS : a. a my_seq -> int = function | Nil -> 0 | Cons (_, my_seq) -> 1 + 2 * sizeS my_seqOCaml 3.12.0 以降であれば、関数に直接型宣言書くだけでOK。
  • 7. Haskellだとdata MySeq a = MSNil | MSCons (a, MySeq (a,a))sizeS :: MySeq a -> IntsizeS MSNil = 0sizeS (MSCons (_, ps)) = 1 + 2 * sizeS psこちらも型宣言書けば問題ない。
  • 8. 再帰関数に型宣言付けるのがキモ型宣言を付けないと、こんなエラーになってしまいます。MySeq.hs:7:40: Occurs check: cannot construct the infinite type: t0 = (t0, t0) Expected type: MySeq t0 Actual type: MySeq (t0, t0) In the first argument of `sizeS, namely `ps In the second argument of `(*), namely `sizeS ps型変数t0が何者なのか調べようとして、発散してしまうらしい。
  • 9. 参考文献* recursive module で polymorphic recursion を書く (camlspotter) http://d.hatena.ne.jp/camlspotter/20090408/1239172620* 多相再帰 - λx.x K S K @ はてな http://d.hatena.ne.jp/KeisukeNakano/20060720/1153367670* polymorphic recursion の話 - Hatena::Diary::pi8027 http://d.hatena.ne.jp/pi8027/20101121/polymorphic_recursion* 今日のスライドで使ったコード例 https://github.com/master-q/readPurelyFunctionalDataStructures/tree/master/PolymorphicRecursion