狠狠撸

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

More Related Content

Clean

Editor's Notes

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