ToDo:
なんと言うのかわからないけど、制約があるということを教えてもらった。いや何か制約があるから型が決定可能になってる、みたいな話は何度か聞いたことがあるんだけど、具体的な例は(見たことがなかった|忘れてた)
# let choose x y = if true then x else y;; val choose : 'a -> 'a -> 'a = <fun> # let id x = x;; val id : 'a -> 'a = <fun> # let cii = (choose id) id;; val cii : '_a -> '_a = <fun>
ここで cii は true ? id : id の結果なので、当然 id と同じものであって欲しい。 id はこういう感じで色んな型の引数を受けつけられる
# id 1;; - : int = 1 # id true;; - : bool = true
cii もそう期待したくて、
# cii 1;; - : int = 1
よしよし、と true を適用すると
# cii true;;
Error: This expression has type bool but an expression was expected of type
int
怒られる。ここで id と cii の型を見ると
# id;; - : 'a -> 'a = <fun> # cii;; - : int -> int = <fun>
と、 cii の方は int に確定してしまっている。これが 'a と '_a の違いらしく、前者は ∀a がついてて、後者は ∃a がついてる感じぽい。
全ての型を受けつけられるけど、一回特定の型相手に使うと型が確定しちゃうものとして、 ref None とかがあるよ、と教えてもらった。
# let a = ref None;;
val a : '_a option ref = {contents = None}
# a := Some 3;;
- : unit = ()
# a;;
- : int option ref = {contents = Some 3}
なるほどねえ。型とかちゃんとやってる人には常識なんだろうけど、なるほどなあと思った
最後に id と cii は型が違うにも関わらず、比較ができてかつ true になる
# id == cii;; - : bool = true
これはなんかちょっと違和感あるな…実体が1つしか無いのはそうなのだろうけど。
あと多相な関数の比較ちょっと面白いな…こういうことができるのね
# id;; - : 'a -> 'a = <fun> # let func x y = fun a -> y;; val func : 'a -> 'b -> 'c -> 'b = <fun> # id == func;; - : bool = false
(19:50)
| 前 | 2018年 12月 |
次 | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | |||||
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。