- 1 名前:デフォルトの名無しさん [2011/11/08(火) 18:06:57.51 ]
- 関数型言語は学習コストが高すぎる。
玩具として、研究者や学生の自己満足として、 教科書や黒板を賑わすアクセサリーとして、 あるいは頭の体操としての価値は認める。 だが、仕事ではほとんど使い物にならない。 やれば作れる、実際に作った、そんな言い分は聞き飽きた。 主要なソフトウェアのほとんどは非関数型で書かれている。 関数型がプチブームだが、爆発的に採用が増えているとも考えられない。 いずれ関数型のブームは去るだろう。 仮に関数型が生き残ることがあったとしても、 手続的な言語における一部の機能としてだろう。
- 751 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:17:13.34 ]
- >>749
let x = ref 0 let f () = x := !x + 1; !x let a = f () in let b = f () in a - b へー、これで a - b が決定されるのは正格評価と関係ないんだ あとdoは構文糖だっていってんだろ 表記が違えば関数じゃなくなるのかよ
- 752 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:24:53.46 ]
- >>751
関係ないよ。
- 753 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:26:05.08 ]
- >>747
机にかじりついて勉強ばかりしている頭でっかちよりも、 時には裏でこっそり「不純な」xx交遊するほうが、生きていて楽しいよねw 私は純粋で品行方正ですなんて、どこかの政治家みたいでかえってうさん臭い
- 754 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:29:42.76 ]
- >>748
>>=は二項演算子だから、bind という関数に置き換えて書くと bind x (lambda a -> bind y (lambda b -> return a + b))
- 755 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:30:59.08 ]
- それただの言い換え・・・
bind って関数の定義を教えてほしいんですけど・・・
- 756 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:32:57.98 ]
- >>752
じゃあこれは? let a = f () in let b = f () in print_int b; print_int a; a - b
- 757 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:35:10.25 ]
- >>755
bind :: [a] -> (a -> [b]) -> [b]
- 758 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:35:42.61 ]
- >>748
>>=は二項演算子だから、bind という関数に置き換えて書くと bind x (lambda a -> bind y (lambda b -> return a + b))
- 759 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:36:19.75 ]
- あれ?何で前に書き込んだ内容が...?
- 760 名前:749 mailto:sage [2012/01/28(土) 11:36:37.96 ]
- >>751
>へー、これで a - b が決定されるのは正格評価と関係ないんだ うん、関係ないよ 関係するのはref(参照型)の使用 繰り返しになるけど、refを使わなければ意味はHaskellと同じ(>>731を参照) あとrefは「ただデータ型」だっていってんだろw
- 761 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:38:48.75 ]
- >>756
関係ないよ 正格と非正格で評価順序が違うから、 副作用のある式を評価すれば当然結果は変わるけど、 正格でも非正格でもそれぞれの評価戦略に従って a - b の値は一意に決定されるよ。
- 762 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:40:45.02 ]
- 参照透過で停止するならチャーチロッサー性により結果は同じ
- 763 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:43:14.27 ]
- >>761
だからrefを使っててもa - bが定まるのは正格評価だからだろ a = f () と b = f () のどっちを先に評価するかで結果変わるんだから もし print_int で出力する時点で評価する遅延評価なら 結果が変わっちゃうだろ
- 764 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:44:53.23 ]
- >>763
>a = f () と b = f () のどっちを先に評価するか それはマイナスという二項演算子の定義の問題 正格評価と全然関係ない
- 765 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:48:55.03 ]
- 参照透過ならまぁそうだね。
- 766 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:51:23.77 ]
- >>757
[a] ってのは何?
- 767 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:52:28.11 ]
- MLは参照透過じゃないからね
- 768 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:54:57.03 ]
- haskellもリストは、完全に参照透過じゃないと思うけど、、、
- 769 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 11:55:26.27 ]
- Haskell は建前参照透過とでも言ったところか
- 770 名前:デフォルトの名無しさん mailto:sage [2012/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 mailto:sage [2012/01/28(土) 12:05:23.04 ]
- >>763
だからrefを使わなければ、正格評価でも非正格評価でも結果は同じ(>>731を参照) そしてrefが使えば結果は変わるけど、そもそもrefの存在が許されるのは正格評価だけで、 非正格評価では(参照透明性が崩れる)refの存在は許されない もしも非正格評価でrefが使えてかつ結果が同じであれば、 その理由が正格/非正格の違いであると考察する事は正しいと思う しかし、残念ながら非正格評価ではrefが使えないから、比較そのものが成立しない 従って、両者の差異を決定付ける要因とは、refを使う/使わないという違いであると結論付けられる ハァ、疲れたョ ここまで書けば納得してもらえるかな?
- 772 名前:デフォルトの名無しさん mailto:sage [2012/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 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 13:25:02.71 ]
- 極端なこと言えば、
非正格評価のメリットって無限リストを扱えることだけじゃん。 それだけのために失っているものが大きすぎじゃね?
- 774 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 17:34:04.06 ]
- 他にも色々なボトムを回避できるけど?
- 775 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 20:16:56.19 ]
- ここまで説明されてもさっぱりわからない
いや、判ろうとしないだけだ なんつって なんつって orz
- 776 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 20:26:38.85 ]
- >>766
汎用のリスト型(aとかbとかのちゃんとした名前は代数型とか何とか言ってた気がする) リストの中身はどんな型でもおk(ただし、中身各要素の型は同じ型で統一しないとダメ) c++のテンプレートとか、c#,javaのジェネリックみたいなもん
- 777 名前:aaa ◆sVVR0Q7eM2 mailto:sage [2012/01/31(火) 11:47:27.11 ]
- a
- 778 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 09:43:15.15 ]
- 最近、アンチスレが隔離スレとして機能してないので他のスレが迷惑な件。
- 779 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:21:12.28 ]
- 今c#使ってて のvarを覚えた
var という暗黙の型を持つことができます。 暗黙的に型指定されたローカル変数は、型を宣言した場合と同様に厳密に型指定されますが、コンパイラが型を決定します。 次に示す 2 つの i の宣言は、機能的に同じです。 とのことことだが関数の人これどう思う? static関数でvar でやってけば関数っぽくなるのでは?
- 780 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 14:24:51.69 ]
- var を メソッドのシグニチャに記述はできないが、できるようにしたらという意味かな。
F# はそういった実装になってる。
|

|