Clean

1,404 views

Published on

Start::Clean

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,404
On SlideShare
0
From Embeds
0
Number of Embeds
378
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Hindley-Damas-Milner の ML と違って型推論できない事があるらしい。 ランク 2 の全称量化型( 3.7.4 参照)が使用される場合、プログラマによる明示的な型付けを必要とする Haslell は System F お
  • ムスカさん( 28 )特務機関
  • File にアスタリスクがついているのが一意型だという事 fwritec の様な破壊的更新を起こす関数に与える引数は一意型でないといけない File"argument 2 of fwritec" attribute at indicated position could not be coerced ^ File
  • オブジェクトk
  • fileA が参照すのは fileA によってかきかえ
  • Let-before 式内では定数選択子(グラフ定義)し # を付ける事によってシャドーイングがおこなわれ
  • Clean のプログラムは Start で開始 World は外部状態すなわち「人生、宇宙、すべての答え」が値 StartIO の 第一引数は NDI,SDI,MDI 第二引数は初期状態 第三引数は関数 (PSt .l) -> (PSt .l) で、ダイアログやメニューのようなプロセス対話コンポーネントを生成 第四引数はプロセス属性のリスト 第五引数は World 基本的に一意な世界を受け取って Dialog の 第一引数はタイトル 第二引数は コントロールの構成 第三引数はウィンドウ属性のリスト ダイアログやボタンはハンドルと呼ばれプロセス状態を受け取って返す状態遷移関数とs
  • A が forall n 詳しくはしらいしさん
  • Haskell と同等のことは白石さんに聞いてください
  • Clean では文字列は Char の配列です。 実際におぶ
  • 自動的にクラスを作成しインスタンスの関数を定義しなくても住むようにする
  • 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>

    ×