• 日時 :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おかしいんじゃね?の件について聞いてきました. -- 樋口? 2006-06-21 (水) 00:41:25
  • Thanks!! -- けいご? 2006-06-21 (水) 03:57:20
  • ユーザーマニュアルに言語の定義やスタンダードライブラリの解説があります。OCamlでプログラミングするときは、必須かと。http://caml.inria.fr/pub/docs/manual-ocaml/index.html。これは tarball にも同梱されていますので、ローカルに参照したほうがいいかも。 -- 小笠原? 2006-07-02 (日) 22:38:39
  • そういえば、TKベースのocamlbrowserという便利な標準ツールもあります。(ガリグ先生作 -- 小笠原? 2006-07-02 (日) 22:41:14

Chapter 6. Exercise続き †

Exercise 10 (末次) †

次の型をもつ関数を定義せよ.

'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を突っ込んだときの表示について †

(('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を突っ込んだときの表示について(続報) &dagger;

ガリグ先生曰く, ","の方がより強く結合するので, この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 &dagger;

活動記録/第7回? に移動しました &dagger;


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-09-27 (土) 20:31:30 (4409d)