Slide 1

Slide 1 text

PFDS Reading Chapter2 永続性

Slide 2

Slide 2 text

永続性( 不変性) 関数型デー タ構造の特徴は常に永続的 そのため更新前のデー タと更新後のデー タを一部共有することで効 率の良いデー タ構造を実現できる

Slide 3

Slide 3 text

リスト c l a s s S t a c k s w h e r e e m p t y : : s a i s E m p t y : : s a ‐ > B o o l c o n s : : a ‐ > s a ‐ > s a h e a d : : s a ‐ > a t a i l : : s a ‐ > s a i n s t a n c e S t a c k [ ] w h e r e e m p t y = [ ] i s E m p t y [ ] = T r u e i s E m p t y _ = F a l s e c o n s x [ ] = [ x ] c o n s x y = x : y h e a d [ ] = e r r o r " h e a d e m p t y " h e a d ( x : x s ) = x t a i l [ ] = e r r o r " t a i l e m p t y " t a i l ( x : x s ) = x s

Slide 4

Slide 4 text

++ ( + + ) : : S t a c k s = > s a ‐ > s a ‐ > s a s 1 + + s 2 | i s E m p t y s 1 = s 2 | o t h e r w i s e = c o n s ( h e a d s 1 ) ( t a i l s 1 + + s 2 ) ( + + ) : : [ a ] ‐ > [ a ] ‐ > [ a ] [ ] + + a s 2 = a s 2 ( a : a s 1 ) + + a s 2 = a : ( a s 1 + + a s 2 ) 変更前と変更後でas2 は共有

Slide 5

Slide 5 text

update u p d a t e : : S t a c k s = > s a ‐ > I n t ‐ > a ‐ > s a u p d a t e s n a | i s E m p t y s = u n d e f i n e d | n = = 0 = c o n s a ( t a i l s ) | o t h e r w i s e = c o n s ( h e a d s ) ( u p d a t e ( t a i l s ) ( n ‐ 1 ) a ) u p d a t e : : [ a ] ‐ > I n t ‐ > a ‐ > [ a ] u p d a t e [ ] _ _ = u n d e f i n e d u p d a t e ( _ : a s ) 0 a = a : a s u p d a t e ( a ' : a s ) n a = a ' : ( u p d a t e a s ( n ‐ 1 ) a ) 変更前と変更後でn 番目以降の要素は共有

Slide 6

Slide 6 text

演習2.1 Q: s u f f i x e s [ 1 , 2 , 3 , 4 ] = [ [ 1 , 2 , 3 , 4 ] , [ 2 , 3 , 4 ] , [ 3 , 4 ] , [ 4 ] , [ ] ] を実装せよ A: s u f f i x e s : : [ a ] ‐ > [ [ a ] ] s u f f i x e s [ ] = [ [ ] ] s u f f i x e s l @ ( _ : t ) = l : s u f f i x e s ( t )

Slide 7

Slide 7 text

二分探索木 d a t a T r e e a = E | T ( T r e e a ) a ( T r e e a ) d e r i v i n g ( S h o w ) a は全順序付けられなければならない Haskell 的には O r d のinstance ML における F u n c t o r はHaskell の F u n c t o r とは違うっぽい?

Slide 8

Slide 8 text

member m e m b e r : : O r d a = > a ‐ > T r e e a ‐ > B o o l m e m b e r a E = F a l s e m e m b e r a ( T l e r ) | a = = e = T r u e | a < e = m e m b e r a l | o t h e r w i s e = m e m b e r a r

Slide 9

Slide 9 text

演習2.2 Q: member 関数において、 比較回数を 2 d ‑> d + 1 に変更せよ。 A: m e m b e r _ E = F a l s e m e m b e r a t @ ( T _ a ' _ ) = m e m b e r ' a ' t w h e r e m e m b e r ' a ' E = a = = a ' m e m b e r ' a ' ( T l a ' ' r ) | a < = a ' ' = m e m b e r ' a ' ' l | o t h e r w i s e = m e m b e r ' a ' r

Slide 10

Slide 10 text

演習2.2 比較時に < = を満たす場合、 等しい可能性があるので覚えておく。 次 に < = を満たすものが出た場合、 そちらに更新する。 例: m e m b e r 5 の場合

Slide 11

Slide 11 text

insert i n s e r t : : O r d a = > a ‐ > T r e e a ‐ > T r e e a i n s e r t a E = T E a E i n s e r t a t @ ( T l e r ) | a = = e = t | a < e = T ( i n s e r t a l ) e r | o t h e r w i s e = T l e ( i n s e r t a r )

Slide 12

Slide 12 text

演習2.3 Q: すでに含まれる要素をinsert した場合、 探索経路全体をコピー し てしまう。 例外を用いてこれを避けよ。 A: i m p o r t D a t a . M a y b e i n s e r t : : O r d a = > a ‐ > T r e e a ‐ > M a y b e ( T r e e a ) i n s e r t a E = J u s t $ T E a E i n s e r t a t @ ( T l e r ) | a = = e = N o t h i n g | a < e = f m a p ( \ l ‐ > T l e r ) ( i n s e r t a l ) | o t h e r w i s e = f m a p ( \ r ‐ > T l e r ) ( i n s e r t a r ) 挿入あたり1 つだけ設置するようにすればよい とは...

Slide 13

Slide 13 text

演習2.4 Q: 不要なコピー をせず、 比較回数が d + 1 回以下のinsert を作成せ よ。 A: i n s e r t a E = J u s t $ T E a E i n s e r t a t @ ( T l a ' r ) = i n s e r t ' a ' t w h e r e i n s e r t ' a ' E = i f a = = a ' t h e n N o t h i n g e l s e J u s t $ T E a i n s e r t ' a ' ( T l a ' ' r ) | a < = a ' ' = f m a p ( \ l ‐ > T l a ' ' r ) ( i n s e r t ' a ' ' l ) | o t h e r w i s e = f m a p ( \ r ‐ > T l a ' ' r ) ( i n s e r t ' a ' r )

Slide 14

Slide 14 text

演習2.5(a) Q: 深さn, 全ての要素がa である完全二分木を作成するcomplete を 作成せよ。 A: c o m p l e t e : : a ‐ > I n t ‐ > T r e e a c o m p l e t e a 0 = E c o m p l e t e a n = l e t b = c o m p l e t e a ( n ‐ 1 ) i n T b a b

Slide 15

Slide 15 text

演習2.5(b) Q: サイズ( ノー ドの数と認識しました) がn の平衡木を作成する関数 を作成せよ。 A: c r e a t e : : a ‐ > I n t ‐ > T r e e a c r e a t e a 0 = E c r e a t e a 1 = T E a E c r e a t e a n | o d d n = l e t t = c r e a t e a ( ( n ‐ 1 ) ` d i v ` 2 ) i n T t a t | o t h e r w i s e = l e t m = ( n ‐ 1 ) ` d i v ` 2 b 1 = c r e a t e a ( m + 1 ) b 2 = c r e a t e a m i n T b 1 a b 2

Slide 16

Slide 16 text

演習2.6 c l a s s F i n i t e M a p m w h e r e e m p t y : : m k a b i n d : : O r d k = > k ‐ > a ‐ > m k a ‐ > M a y b e ( m k a ) l o o k u p : : O r d k = > k ‐ > m k a ‐ > M a y b e a d a t a M a p T r e e k a = M E | M T ( M a p T r e e k a ) k a ( M a p T r e e k a ) d e r i v i n g ( i n s t a n c e F i n i t e M a p M a p T r e e w h e r e e m p t y = M E b i n d k a t @ ( M T l k ' a ' r ) = b i n d ' ( k ' , a ' ) t w h e r e b i n d ' ( k ' , a ' ) M E = i f k = = k ' t h e n N o t h i n g e l s e J u s t $ M T b i n d ' k v ( M T l k ' a ' r ) | k < = k ' = f m a p ( \ l ‐ > M T l k ' a ' r ) ( b i n d ' ( k ' , a ' ) l ) | o t h e r w i s e = f m a p ( \ r ‐ > M T l k ' a ' r ) ( b i n d ' k v r ) l o o k u p k t @ ( M T l k ' a r ) = l o o k u p ' ( k ' , a ) t w h e r e l o o k u p ' ( k ' , a ) M E = i f k = = k ' t h e n J u s t a e l s e N o t h i n g l o o k u p ' k v ( M T l k ' a r ) | k < = k ' = l o o k u p ' ( k ' , a ) l | o t h e r w i s e = l o o k u p ' k v r