緩募 浅井健一『プログラミングの基礎』の問題 13.5 の解説についての不明点解消 OCaml または Haskell

この記事は3分で読めます

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては中高数学駆け込み寺,
大学数学に関しては現代数学観光ツアーという無料の通信講座があります.
ご興味のある方はぜひお気軽にご登録ください!


いろいろあって今, 浅井健一『プログラミングの基礎』を読んでいる.

これの問題 13.5 の解説がよくわからないので,
その情報を集めるべく, とりあえず記事としてまとめる.
その問題は次のような内容.

上で作った twice に twice 自身を渡して twice twice とすることができる.
ここで返ってくる関数はどのような関数か.
その型は何か.

twice は次のような関数だ.

let twice f =
  let g x = f (f x)
  in g
val twice : ('a -> 'a) -> 'a -> 'a = <fun>

で, 問題はこれの解答.
本のホームページに載っているのでとりあえず全文引用する.

受け取った関数を4回、実行するような関数を返す関数。例えば、以下。

let twice f =
let g x = f (f x)
in g ;;
val twice : (‘a -> ‘a) -> ‘a -> ‘a =
let g = twice twice ;;
val g : (‘_a -> ‘_a) -> ‘_a -> ‘_a =
let h = g (fun x -> x + 1) ;;
val h : int -> int =
h 3 ;;
– : int = 7

関数 h は (fun x -> x + 1) を4回、実行するような関数になっている。

関数 g の型は、

(‘a -> ‘a) -> ‘a -> ‘a

という多相型になりそうなところだが、そうはならず

(‘_a -> ‘_a) -> ‘_a -> ‘_a

という特殊な型になる。この型は ‘_a を一度だけ具体的な型にすることが
できるようなもので、実質的に単相な型である。実際、上のように一度、
int -> int 型の関数 (fun x -> x + 1) を g に渡すと、g の型は

g ;;
– : (int -> int) -> int -> int =

に固定される。この後、g には int -> int 型以外の関数を渡すことはで
きない。このようになっているのは、多相性と後の章で説明する例外や参
照型が干渉するためである。g を多相関数として定義したい場合は、以下
のようにする。

let g x = (twice twice) x ;;
val g : (‘a -> ‘a) -> ‘a -> ‘a =

で, これがよくわからない.
個人的にほんの少しだけ OCaml よりは慣れている Haskell で軽く書いてみたら,
次のようになった.

twice f =
  let g x = f (f x)
  in g
g = twice twice

twice2 f = f . f
h = twice2 twice2

これを REPL に通して :type してみると次の通り.

λ> :type twice
twice :: (t -> t) -> t -> t
λ> :type twice2
twice2 :: (a -> a) -> a -> a

この Haskell のコードでの twice が「実質的に単相な型」というやつで,
twice2 が多相関数になっているのだと理解している.
最初 Haskell に移植して書いたときは後者の合成の方法で書いていて,
「Haskell と OCaml は挙動が違うのか」と思ったが,
どうも同じなようだ (と理解している).
いまのところ, 元の解答の記述でいう「例外や参照型の干渉」は
Haskell でも似たことが起こるのだろうという理解.

コメントいただいたので削除.

改めて例外と言われると, 表層的な理解しかしていないことに気付くし,
参照型にいたってははじめて聞いた話で全く理解していない.
実際にどういう話になっているのか,
私にその受け皿が全くないので説明を受けても理解できるとも全く思えない.

しかし気になったのでとりあえずまとめておく.
何かよい解説記事や PDF などあればぜひ教えてほしい.

追記

camloeba さんからご親切にもコメントを頂いた.

上の記録にも訂正を入れた.
とりあえずちょびちょび調べていこう.


中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては中高数学駆け込み寺,
大学数学に関しては現代数学観光ツアーという無料の通信講座があります.
ご興味のある方はぜひお気軽にご登録ください!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

このサイトについて

はじめまして。相転移Pです。数学・物理の情報を中心にアカデミックな話題を発信しています。このサイトを見て興味があればぜひご連絡ください。 mail: phasetr@gmail.com LINE: oxg2753d
  • このエントリーをはてなブックマークに追加
  • LINEで送る

YouTube チャンネル登録

講義など動画を使った形式の方が良いコンテンツは動画にしています。ぜひチャンネル登録を!

メルマガ登録

メルマガ登録ページからご登録ください。 数学・物理の専門的な情報と大学受験向けのメルマガの 2 種類があります。

役に立つ・面白い記事があればクリックを!

記事の編集ページから「おすすめ記事」を複数選択してください。