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

PFDS 10.1.1 多相再帰

on

  • 683 views

 

Statistics

Views

Total Views
683
Views on SlideShare
683
Embed Views
0

Actions

Likes
2
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

PFDS 10.1.1 多相再帰 PFDS 10.1.1 多相再帰 Presentation Transcript

  • PFDS 10.1.1 多相再帰 Kiwamu Okabe
  • 多相再帰って何?再帰を一つ進める前と後とで型が異なること。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
  • SMLで書きたい...んだけどPFDSによるとStandard MLでは...☆ 多相的なデータ型を定義することは可能☆ 多相再帰を書くことは不可能SML# や SML/NJ はどーなのか気になりますね。 (すいません試してないです)
  • 多相再帰=>単相再帰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のように多相再帰=>単相再帰への変換が必ず可能です。
  • それなら全部単相再帰で書くべき?それはもったいない!☆ 多相にすれば型宣言を2つ=>1つに削減できた☆ a EP型へのパターンマッチが不要で、そのコンストラクタをメモリに置く必要がない☆ 多相にすれば、Seqの段数とペアの数が一致することを型が保証してくれる
  • 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。
  • Haskellだとdata MySeq a = MSNil | MSCons (a, MySeq (a,a))sizeS :: MySeq a -> IntsizeS MSNil = 0sizeS (MSCons (_, ps)) = 1 + 2 * sizeS psこちらも型宣言書けば問題ない。
  • 再帰関数に型宣言付けるのがキモ型宣言を付けないと、こんなエラーになってしまいます。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が何者なのか調べようとして、発散してしまうらしい。
  • 参考文献* 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