//*予定のみ [#d16f4ec7] -- - 日時 :2006/6/19 (Mon) - 場所 :名大 理学部1号館(多元数理科学研究科) 307室? - 時刻 :18:00〜19:30 - 参加者:??名 - 話題 : --value restriction と 副作用の関係について --テキストが終わったらどうする? ---ライブラリ/マニュアルの引き方を知っておきたい ← 小笠原さん,HELP US!! ---''OBJECTIVE'' な OCaml を知りたい ---ゲームを作る (さめがめとか) ---ocamlp4 ---Haskell / Parsec 勉強会へシフト ---SICPまたはTAPLをやる ← 英語はヤメてという意見も ---水野くんがCGIフレームワークを作る ---圏論勉強会? ← 群論が『具体的』とかいう人とは友達になれないよ! - Chapt. 6 Ex 10のf4おかしいんじゃね?の件について聞いてきました. -- [[樋口]] &new{2006-06-21 (水) 00:41:25}; - Thanks!! -- [[けいご]] &new{2006-06-21 (水) 03:57:20}; - ユーザーマニュアルに言語の定義やスタンダードライブラリの解説があります。OCamlでプログラミングするときは、必須かと。http://caml.inria.fr/pub/docs/manual-ocaml/index.html。これは tarball にも同梱されていますので、ローカルに参照したほうがいいかも。 -- [[小笠原]] &new{2006-07-02 (日) 22:38:39}; - そういえば、TKベースのocamlbrowserという便利な標準ツールもあります。(ガリグ先生作 -- [[小笠原]] &new{2006-07-02 (日) 22:41:14}; - RJFecEsxIAKnRbR -- [[hljwohgs]] &new{2008-09-23 (火) 10:36:05}; - qUMJobbNs -- [[jfmvean]] &new{2008-09-26 (金) 22:50:18}; #comment ---- #contents *Chapter 6. Exercise続き [#b24a5ea9] **Exercise 10 (末次)[#g3e08704] 次の型をもつ関数を定義せよ. 'a * ('b, 'c) sum -> ('a * 'b, 'a * 'c) sum let f1 (x, y) = match y with Left n -> Left (x, n) | Right n -> Right (x, n);; ('a, 'b) sum * ('c, 'd) sum -> (('a * 'c, 'b * 'd) sum, ('a * 'd, 'b * 'c) sum) sum let f2 (x, y) = match (x, y) with (Left n, Left m) -> Left (Left (n, m)) | (Left n, Right m) -> Right (Left (n, m)) | (Right n, Left m) -> Right (Right (n, m)) | (Right n, Right m) -> Left (Right (n, m));; ('a -> 'b) * ('c -> 'b) -> ('a, 'c) sum -> 'b let f3 (x, y) = function Left m -> x m | Right m -> y m;; (('a, 'b) sum -> 'c) -> ('a -> 'c) * ('b -> 'c) let f4 f = (fun x -> f(Left x), fun y -> f(Right y));; ('a -> 'b, 'a -> 'c) sum -> ('a -> ('b,'c) sum) let f5 = function Left l -> (fun x -> Left (l x)) | Right r -> (fun x -> Right (r x));; ただし, type ('a, 'b) sum = Left of 'a | Right of 'b;; *** f4を突っ込んだときの表示について [#ic56b447] (('a, 'b) sum -> 'c) -> ('a -> 'c) * ('b -> 'c) # type ('a, 'b) sum = Left of 'a | Right of 'b;; type ('a, 'b) sum = Left of 'a | Right of 'b # let f4 f = (fun x -> f(Left x), fun y -> f(Right y));; val f4 : (('a, 'b) sum -> 'c) -> 'a -> 'c * ('b -> 'c) = <fun> テキスト3.2.3によると,* は -> より強く結合するとあるので, val f4 : (('a, 'b) sum -> 'c) -> ('a -> 'c) * ('b -> 'c) = <fun> こうでないと意図している型を意味しないのでは? %%??pretty-printerのバグ?%%それとも?~ *** f4を突っ込んだときの表示について(続報) [#j1824f84] ~ガリグ先生曰く, ","の方がより強く結合するので, このf4の定義がそもそも課題の指定する型になっていない.~ すなわち,現行のf4の定義は次のものと同じ事になっている _ _ # let f4 f = (fun x -> ( f(Left x), fun y -> f(Right y) ));; val f4 : (('a, 'b) sum -> 'c) -> 'a -> 'c * ('b -> 'c) = <fun> 課題の要件を満たすようにするためには, 次のようにfun x -> ...を括弧でくくる必要がある. _ _ # let f4' f = ((fun x -> f(Left x)), fun y -> f(Right y));; val f4' : (('a, 'b) sum -> 'c) -> ('a -> 'c) * ('b -> 'c) = <fun> *Chapter 7. Exercise [#bfc07932] **[[活動記録/第7回]] に移動しました [#qc3e1f84]