Clean 概説  
Clean の機能 <ul><li>遅延評価 </li></ul><ul><li>自動カリー化 </li></ul><ul><li>型クラス </li></ul><ul><li>代数的データ構造 </li></ul><ul><li>Milner...
だいたい Haskell と一緒
一意型 <ul><li>副作用を実現しつつ参照透明性を保証するため </li></ul>
参照透明性って <ul><li>関数と引数の組み合わせが一緒なら結果は常に同じ! </li></ul><ul><li>f x = x + 1 </li></ul><ul><li>なら <f,x=2> なら必ず 2 をかえす </li></ul>...
シャドーイング + 再束縛ならおk ? <ul><li>let a = 3 in </li></ul><ul><li>   let a = a + 1 </li></ul><ul><li>ならおkじゃね? </li></ul>
問題 <ul><li>let a1 = fread f  :: String </li></ul><ul><li>let f = fwrite 'a' f :: File </li></ul><ul><li>let a2 = fread f  ...
  <ul><li>ファルス ! </li></ul><ul><li>※ フォールスです </li></ul>
  <ul><li>駄目じゃん </li></ul>
  <ul><li>a1 が参照できなけばおk </li></ul><ul><li>それが </li></ul><ul><li>一意型 </li></ul>
一意型のアイディア <ul><li>破壊的更新をしても観察できなければおk </li></ul><ul><li>破壊的更新をした後に前の参照を持たなければおk </li></ul>
一意型をつかった例 <ul><li>WriteAB :: *File -> File  </li></ul><ul><li>WriteAB file = fileAB  </li></ul><ul><li>where fileA = fwrit...
一意型の例 <ul><li>AppendAB :: *File -> (File, File)  </li></ul><ul><li>AppendAB file = (fileA, fileB)  </li></ul><ul><li>where...
なぜエラーになったか <ul><li>file に対する参照が二つ </li></ul><ul><li>一意型は object に対する参照が一つでないといけない </li></ul>
最初のれ <ul><li>どのように簡約されるのか </li></ul>
次の例 <ul><li>file に対して参照が二つあるのダメ </li></ul>
こういう風にも書ける <ul><li>WriteAB :: *File -> File  </li></ul><ul><li>WriteAB file  </li></ul><ul><li>  # file = fwritec 'a' file...
なにが言いたいか <ul><li>命令型のプログラマは </li></ul><ul><li>同じ事を頭の中でやっている ! </li></ul>
GUI <ul><li>module hello </li></ul><ul><li>import StdEnv, StdIO </li></ul><ul><li>Start :: *World -> *World </li></ul><ul>...
全称量化子 <ul><li>:: T2 b = C2 (b: b -> b)      -- ×  </li></ul><ul><li>:: T2 b = C2 (A.b: b -> b)            -- ◯ </li></ul><...
存在量化子 <ul><li>:: List = E.a: Cons a List | Nil </li></ul><ul><li>newlist = Cons 1 Nil </li></ul><ul><li>Hd :: List -> ? //...
配列 <ul><li>リストと配列の変換 </li></ul><ul><li>NewArray = {elem  elem <- ListA}NewList = {elem  elem <-: ArrayA} </li></ul><ul><li...
マクロ <ul><li>  :: Color :== Int   Black :== 1   White :== 0   invert :: Color -> Color   invert Black = White   invert Whit...
総称プログラミング <ul><li>めんどくさいんで記事 </li></ul>
項グラフ書き換 <ul><li>Clean の意味論は項グラフ書き換 </li></ul><ul><li>Clean のプログラムは Start から始まるグラフ </li></ul><ul><li>関数はグラフ書き換え規則 </li></ul...
  <ul><li>Start :: Int  </li></ul><ul><li>Start = Length [3,4]  </li></ul><ul><li>  Length :: [x] -> Int  </li></ul><ul><l...
  <ul><li>Start  ||a:                  これは唯一の可約式であり、 Start 規則を適用する  ->  </li></ul><ul><li>Length [3,4]  ||b:       このグラフは、...
  <ul><li>  </li></ul>
グラフと書き換え規則 <ul><li>GRS = {Rule} ; </li></ul><ul><li>Rule = RedexPattern '->' ContractumPattern [',' Redirection] </li></ul...
Upcoming SlideShare
Loading in …5
×

Clean

1,258 views

Published on

Start::Clean

Published in: Technology, Education
  • Be the first to comment

Clean

  1. 1. Clean 概説  
  2. 2. Clean の機能 <ul><li>遅延評価 </li></ul><ul><li>自動カリー化 </li></ul><ul><li>型クラス </li></ul><ul><li>代数的データ構造 </li></ul><ul><li>Milner/Mycroft に基づく型システム </li></ul><ul><li>マクロ </li></ul><ul><li>一意型 </li></ul><ul><li>総称型 </li></ul><ul><li>ダイナミック </li></ul>
  3. 3. だいたい Haskell と一緒
  4. 4. 一意型 <ul><li>副作用を実現しつつ参照透明性を保証するため </li></ul>
  5. 5. 参照透明性って <ul><li>関数と引数の組み合わせが一緒なら結果は常に同じ! </li></ul><ul><li>f x = x + 1 </li></ul><ul><li>なら <f,x=2> なら必ず 2 をかえす </li></ul><ul><li>a = 3 </li></ul><ul><li>なら必ず a は 3 </li></ul><ul><li>a = 3;a = a+1; </li></ul><ul><li>結果が同じじゃなくなる! </li></ul><ul><li>参照透明性が保証されない! </li></ul>
  6. 6. シャドーイング + 再束縛ならおk ? <ul><li>let a = 3 in </li></ul><ul><li>  let a = a + 1 </li></ul><ul><li>ならおkじゃね? </li></ul>
  7. 7. 問題 <ul><li>let a1 = fread f  :: String </li></ul><ul><li>let f = fwrite 'a' f :: File </li></ul><ul><li>let a2 = fread f  :: String </li></ul><ul><li>a1 == a2 </li></ul><ul><li><false> </li></ul><ul><li>一行目と三行目の結果が違う! </li></ul><ul><li>参照透明性が壊れる!   </li></ul>
  8. 8.   <ul><li>ファルス ! </li></ul><ul><li>※ フォールスです </li></ul>
  9. 9.   <ul><li>駄目じゃん </li></ul>
  10. 10.   <ul><li>a1 が参照できなけばおk </li></ul><ul><li>それが </li></ul><ul><li>一意型 </li></ul>
  11. 11. 一意型のアイディア <ul><li>破壊的更新をしても観察できなければおk </li></ul><ul><li>破壊的更新をした後に前の参照を持たなければおk </li></ul>
  12. 12. 一意型をつかった例 <ul><li>WriteAB :: *File -> File  </li></ul><ul><li>WriteAB file = fileAB  </li></ul><ul><li>where fileA = fwritec 'a' file  </li></ul><ul><li>  fileAB = fwritec 'b' fileA </li></ul>
  13. 13. 一意型の例 <ul><li>AppendAB :: *File -> (File, File)  </li></ul><ul><li>AppendAB file = (fileA, fileB)  </li></ul><ul><li>where fileA = fwritec 'a' file  </li></ul><ul><li>  fileB = fwritec 'b' file </li></ul><ul><li>< エラーになる > </li></ul><ul><li>Uniqueness error [tak.icl,23,AppendAB]: &quot;file&quot; demanded attribute cannot be offered by shared object </li></ul>
  14. 14. なぜエラーになったか <ul><li>file に対する参照が二つ </li></ul><ul><li>一意型は object に対する参照が一つでないといけない </li></ul>
  15. 15. 最初のれ <ul><li>どのように簡約されるのか </li></ul>
  16. 16. 次の例 <ul><li>file に対して参照が二つあるのダメ </li></ul>
  17. 17. こういう風にも書ける <ul><li>WriteAB :: *File -> File  </li></ul><ul><li>WriteAB file  </li></ul><ul><li>  # file = fwritec 'a' file  </li></ul><ul><li>  # file = fwritec 'b'  </li></ul><ul><li>file = file </li></ul><ul><li>命令型みたいにこういう風にもかけます。 </li></ul>
  18. 18. なにが言いたいか <ul><li>命令型のプログラマは </li></ul><ul><li>同じ事を頭の中でやっている ! </li></ul>
  19. 19. GUI <ul><li>module hello </li></ul><ul><li>import StdEnv, StdIO </li></ul><ul><li>Start :: *World -> *World </li></ul><ul><li>Start world </li></ul><ul><li>= startIO NDI Void (snd o openDialog undef hello) [] world </li></ul><ul><li>where </li></ul><ul><li>hello = Dialog &quot;&quot; (TextControl &quot;Hello world!&quot; [])  </li></ul><ul><li>                [WindowClose (noLS closeProcess)] </li></ul>
  20. 20. 全称量化子 <ul><li>:: T2 b = C2 (b: b -> b)      -- ×  </li></ul><ul><li>:: T2 b = C2 (A.b: b -> b)            -- ◯ </li></ul><ul><li>f2:: (T2 b) -> (Int,Char) </li></ul><ul><li>f2 (C2 g) = (g 1, g 'a') </li></ul><ul><li>たぶん Haskell と同じなので言うことは特にない… </li></ul>
  21. 21. 存在量化子 <ul><li>:: List = E.a: Cons a List | Nil </li></ul><ul><li>newlist = Cons 1 Nil </li></ul><ul><li>Hd :: List -> ? // 静的に型付けできない </li></ul><ul><li>Hd (Cons x xs) = x // コンパイルエラーになる </li></ul><ul><li>Tl :: List -> List //OK </li></ul><ul><li>Tl (Cons x xs) = xs </li></ul><ul><li>取り出す方法がない </li></ul><ul><li>隠蔽された状態を表現可能 </li></ul>
  22. 22. 配列 <ul><li>リストと配列の変換 </li></ul><ul><li>NewArray = {elem elem <- ListA}NewList = {elem elem <-: ArrayA} </li></ul><ul><li>配列の更新 {Array5 & [i]=2*i+1 i <- [0..4]} // 配列の更新 {1,3,5,7,9} を出力する </li></ul><ul><li>配列のパターン </li></ul><ul><li>CopyFirst j a=:{[0]=a0} = {a & [j] = a0} </li></ul>
  23. 23. マクロ <ul><li>  :: Color :== Int   Black :== 1   White :== 0   invert :: Color -> Color   invert Black = White   invert White = Black </li></ul>
  24. 24. 総称プログラミング <ul><li>めんどくさいんで記事 </li></ul>
  25. 25. 項グラフ書き換 <ul><li>Clean の意味論は項グラフ書き換 </li></ul><ul><li>Clean のプログラムは Start から始まるグラフ </li></ul><ul><li>関数はグラフ書き換え規則 </li></ul><ul><li>グラフに対してグラフ書き換え規則を適用するのが計算 </li></ul><ul><li>グラフ書き換えが出来なくなったものを正規形 </li></ul>
  26. 26.   <ul><li>Start :: Int  </li></ul><ul><li>Start = Length [3,4]  </li></ul><ul><li>  Length :: [x] -> Int  </li></ul><ul><li>Length [a:x] = 1 + Length x  </li></ul><ul><li>Length [] = 0 </li></ul>
  27. 27.   <ul><li>Start ||a:                 これは唯一の可約式であり、 Start 規則を適用する ->  </li></ul><ul><li>Length [3,4] ||b:       このグラフは、全体として新しい可約式である ->  </li></ul><ul><li>1 + Length [4] ||c:       加算演算子 + は、2番目の引数の評価を強制する ->  </li></ul><ul><li>1 + 1 + Length [] ||d:   また + の2番目の引数 ->  </li></ul><ul><li>1 + 1 + 0 ||e:             2番目の + の2番目の引数は、 (r)nf に書換えられる ->  </li></ul><ul><li>1 + 1 ||f:                 グラフは、全体として新しい可約式である ->  </li></ul><ul><li>2 ||g:                         グラフは、 (r)nf の中にある </li></ul>
  28. 28.   <ul><li>  </li></ul>
  29. 29. グラフと書き換え規則 <ul><li>GRS = {Rule} ; </li></ul><ul><li>Rule = RedexPattern '->' ContractumPattern [',' Redirection] </li></ul><ul><li>          | RedexPattern '->' Redirection ; </li></ul><ul><li>RedexPattern         = Graph ; </li></ul><ul><li>ContractumPattern = Graph ; </li></ul><ul><li>Graph               = [Nodeid ':'] Node {',' NodeDef} ; </li></ul><ul><li>Nodeid              = NodeIdVariable | NodeIdConstant ; </li></ul><ul><li>Node                = Symbol {Arg} | EmptyNode ; </li></ul><ul><li>Symbol            = Constant ; </li></ul><ul><li>Arg                  = Nodeid | [Nodeid ':'] Symbol </li></ul><ul><li>                        | [Nodeid ':'] '(' Node ')' ; </li></ul><ul><li>EmptyNode    = '_|_'; </li></ul><ul><li>NodeDef         = Nodeid ':' Node ; </li></ul><ul><li>Redirection     = Nodeid ':=' Nodeid | Nodeid ; </li></ul>

×