トップ «前の日記(2018-12-12) 最新 次の日記(2018-12-16)» 編集

はじめてのにき

ここの位置付け

2004|11|
2005|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ToDo:


2018-12-15

_ let 多相

なんと言うのかわからないけど、制約があるということを教えてもらった。いや何か制約があるから型が決定可能になってる、みたいな話は何度か聞いたことがあるんだけど、具体的な例は(見たことがなかった|忘れてた)

# 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)

お名前:
E-mail:
コメント:
人生、宇宙、すべての答え
本日のリンク元

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
1.shinh(2018-12-25 01:59) 2.Mak(2018-12-24 12:41) 3.shinh(2018-12-13 02:54)
search / home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h