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扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。