12/01/28 11:36:37.96
>>751
>へー、これで a - b が決定されるのは正格評価と関係ないんだ
うん、関係ないよ
関係するのはref(参照型)の使用
繰り返しになるけど、refを使わなければ意味はHaskellと同じ(>>731を参照)
あとrefは「ただデータ型」だっていってんだろw
761:デフォルトの名無しさん
12/01/28 11:38:48.75
>>756
関係ないよ
正格と非正格で評価順序が違うから、
副作用のある式を評価すれば当然結果は変わるけど、
正格でも非正格でもそれぞれの評価戦略に従って a - b の値は一意に決定されるよ。
762:デフォルトの名無しさん
12/01/28 11:40:45.02
参照透過で停止するならチャーチロッサー性により結果は同じ
763:デフォルトの名無しさん
12/01/28 11:43:14.27
>>761
だからrefを使っててもa - bが定まるのは正格評価だからだろ
a = f () と b = f () のどっちを先に評価するかで結果変わるんだから
もし print_int で出力する時点で評価する遅延評価なら
結果が変わっちゃうだろ
764:デフォルトの名無しさん
12/01/28 11:44:53.23
>>763
>a = f () と b = f () のどっちを先に評価するか
それはマイナスという二項演算子の定義の問題
正格評価と全然関係ない
765:デフォルトの名無しさん
12/01/28 11:48:55.03
参照透過ならまぁそうだね。
766:デフォルトの名無しさん
12/01/28 11:51:23.77
>>757
[a] ってのは何?
767:デフォルトの名無しさん
12/01/28 11:52:28.11
MLは参照透過じゃないからね
768:デフォルトの名無しさん
12/01/28 11:54:57.03
haskellもリストは、完全に参照透過じゃないと思うけど、、、
769:デフォルトの名無しさん
12/01/28 11:55:26.27
Haskell は建前参照透過とでも言ったところか
770:デフォルトの名無しさん
12/01/28 11:58:20.28
>>766
[]はリストじゃない?
一般的には (>>=) :: m a -> (a -> m b) -> m b じゃないの?
Haskell知らんけど(定義はwebからコピった)
OCamlなら
(>>=) : 'a t -> ('a -> 'a t) -> 'a t
return : 'a -> 'a t
771:749
12/01/28 12:05:23.04
>>763
だからrefを使わなければ、正格評価でも非正格評価でも結果は同じ(>>731を参照)
そしてrefが使えば結果は変わるけど、そもそもrefの存在が許されるのは正格評価だけで、
非正格評価では(参照透明性が崩れる)refの存在は許されない
もしも非正格評価でrefが使えてかつ結果が同じであれば、
その理由が正格/非正格の違いであると考察する事は正しいと思う
しかし、残念ながら非正格評価ではrefが使えないから、比較そのものが成立しない
従って、両者の差異を決定付ける要因とは、refを使う/使わないという違いであると結論付けられる
ハァ、疲れたョ
ここまで書けば納得してもらえるかな?
772:デフォルトの名無しさん
12/01/28 12:43:21.61
let x = ref 0
let f () = lazy (x := !x + 1; !x)
let (!$) x = Lazy.force x
let a = f () in
let b = f () in
print_int (!$ b);
print_int (!$ a);
(!$ a) - (!$ b)
lazyで遅延評価するとref型を使ってもletの順番には異存しないよ
773:デフォルトの名無しさん
12/01/28 13:25:02.71
極端なこと言えば、
非正格評価のメリットって無限リストを扱えることだけじゃん。
それだけのために失っているものが大きすぎじゃね?
774:デフォルトの名無しさん
12/01/28 17:34:04.06
他にも色々なボトムを回避できるけど?
775:デフォルトの名無しさん
12/01/28 20:16:56.19
ここまで説明されてもさっぱりわからない
いや、判ろうとしないだけだ
なんつって
なんつって
orz
776:デフォルトの名無しさん
12/01/28 20:26:38.85
>>766
汎用のリスト型(aとかbとかのちゃんとした名前は代数型とか何とか言ってた気がする)
リストの中身はどんな型でもおk(ただし、中身各要素の型は同じ型で統一しないとダメ)
c++のテンプレートとか、c#,javaのジェネリックみたいなもん
777:aaa ◆sVVR0Q7eM2
12/01/31 11:47:27.11
a
778:デフォルトの名無しさん
12/02/01 09:43:15.15
最近、アンチスレが隔離スレとして機能してないので他のスレが迷惑な件。
779:デフォルトの名無しさん
12/02/01 14:21:12.28
今c#使ってて のvarを覚えた
var という暗黙の型を持つことができます。
暗黙的に型指定されたローカル変数は、型を宣言した場合と同様に厳密に型指定されますが、コンパイラが型を決定します。 次に示す 2 つの i の宣言は、機能的に同じです。
とのことことだが関数の人これどう思う?
static関数でvar でやってけば関数っぽくなるのでは?
780:デフォルトの名無しさん
12/02/01 14:24:51.69
var を メソッドのシグニチャに記述はできないが、できるようにしたらという意味かな。
F# はそういった実装になってる。