Your SlideShare is downloading. ×
0
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
PFDS 10.1.1 多相再帰
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

PFDS 10.1.1 多相再帰

428

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
428
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
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

×