前スレ
http://toro.2ch.net/test/read.cgi/tech/1320743217/
探検
【アンチ】関数型言語は使えない【玩具】 2
■ このスレッドは過去ログ倉庫に格納されています
2012/02/28(火) 20:45:47.95
126デフォルトの名無しさん
2012/03/03(土) 21:14:44.32 末尾再帰最適化とか、マジ関係無いだろ
実装上の話だろ
実装上の話だろ
127デフォルトの名無しさん
2012/03/03(土) 21:47:46.75 GCC(C/C++) → 末尾再帰最適化あり
あとC++のboost::lambda(ラムダ式)とはどうなんだろうか
言語自体に直接ラムダ式があるわけじゃないけど
boost::lambdaとスマートポインタでクロージャも作れるらしい
壁4はよく分からない
あとC++のboost::lambda(ラムダ式)とはどうなんだろうか
言語自体に直接ラムダ式があるわけじゃないけど
boost::lambdaとスマートポインタでクロージャも作れるらしい
壁4はよく分からない
128125
2012/03/03(土) 22:07:55.69 >>126
関数型言語にとってリストが最も基本的な複合データ型であることは、
誰もが認めることだろう
でも末尾再帰最適化が実装されていない言語の多くでは、
可変長配列(RubyであればArrayクラス)でリストを代用している
もしも、これを真面目に「ドット対の連なり」としてリストを定義して
その操作を再帰関数で定義した場合、ちょっとしたデータ量であっても
簡単にスタックオーバーフローが発生してしまう
だから、関数型言語で書かれたコードを末尾再帰最適化が実装されていない言語へ
移植しようとした場合、再帰ではなくfor/while文のような手続き型構文を使わざるをえない
これは(末尾再帰最適化という)実装がプログラミングスタイルに大きな影響を与えるという
典型的な一例であると思う
関数型言語にとってリストが最も基本的な複合データ型であることは、
誰もが認めることだろう
でも末尾再帰最適化が実装されていない言語の多くでは、
可変長配列(RubyであればArrayクラス)でリストを代用している
もしも、これを真面目に「ドット対の連なり」としてリストを定義して
その操作を再帰関数で定義した場合、ちょっとしたデータ量であっても
簡単にスタックオーバーフローが発生してしまう
だから、関数型言語で書かれたコードを末尾再帰最適化が実装されていない言語へ
移植しようとした場合、再帰ではなくfor/while文のような手続き型構文を使わざるをえない
これは(末尾再帰最適化という)実装がプログラミングスタイルに大きな影響を与えるという
典型的な一例であると思う
129デフォルトの名無しさん
2012/03/03(土) 22:11:49.10130デフォルトの名無しさん
2012/03/03(土) 22:12:39.97131デフォルトの名無しさん
2012/03/03(土) 22:41:56.15 リストは副作用を嫌う関数的プログラミングがLISPから借りてきた実装上の「逃げ」。
末尾再帰最適化でループの代用にしたのと根っこは同じ。
末尾再帰最適化でループの代用にしたのと根っこは同じ。
132デフォルトの名無しさん
2012/03/03(土) 22:56:45.86 ま、実用を目指したコンピュータ言語なんてものは
全てが実装上の話になってしまうんだけどな。
全てが実装上の話になってしまうんだけどな。
133デフォルトの名無しさん
2012/03/04(日) 01:14:03.00 末尾再帰なんてC言語の教科書で知ったから
関数型言語と結びつけるイメージが全く沸かない
関数型言語と結びつけるイメージが全く沸かない
134デフォルトの名無しさん
2012/03/04(日) 03:15:06.28 128は本質をついている。
リストは再帰的データ構造を持つので、
再帰を反復の記述にとる関数型とは相性がいい。
リストは再帰的データ構造を持つので、
再帰を反復の記述にとる関数型とは相性がいい。
135デフォルトの名無しさん
2012/03/04(日) 03:45:32.27 関数型言語にとって副作用が無いことは
本質的なことなの?
そうだと言える根拠とかあるの?
MLやHaskellが設計された頃の流行りだった
だけじゃないの?
”副作用は悪”っていう思想は、古いアルゴリズムの
教科書にはよく載ってる
本質的なことなの?
そうだと言える根拠とかあるの?
MLやHaskellが設計された頃の流行りだった
だけじゃないの?
”副作用は悪”っていう思想は、古いアルゴリズムの
教科書にはよく載ってる
136デフォルトの名無しさん
2012/03/04(日) 05:47:41.38137デフォルトの名無しさん
2012/03/04(日) 05:50:20.88138デフォルトの名無しさん
2012/03/04(日) 09:08:06.01 >>137
宣言という言葉をあまり狭義に使うのはどうかな。
IBMの簡易言語RPG(現在バージョンはIVかな)は
Decision Tableを使って制御を行っているので、
昔は宣言型言語に分類されていた。同じ宣言でも
こうまで異なると問題だ。
宣言という言葉をあまり狭義に使うのはどうかな。
IBMの簡易言語RPG(現在バージョンはIVかな)は
Decision Tableを使って制御を行っているので、
昔は宣言型言語に分類されていた。同じ宣言でも
こうまで異なると問題だ。
139デフォルトの名無しさん
2012/03/04(日) 09:23:41.58 定義のことを宣言って言ってるだけじゃね?
英語でどうなんだか知らんけど。
英語でどうなんだか知らんけど。
140デフォルトの名無しさん
2012/03/04(日) 10:33:53.88 CTMCPすら知らずに妄想する隔離スレか。
141デフォルトの名無しさん
2012/03/04(日) 10:43:48.80 抽象度が高いことを示すコードが出てないんだが
pythonに作れなくて、Haskellに作れるものって何がある?
とりあえずHaskellでif関数自作できるとかはよく見かけるが
pythonに作れなくて、Haskellに作れるものって何がある?
とりあえずHaskellでif関数自作できるとかはよく見かけるが
142デフォルトの名無しさん
2012/03/04(日) 11:05:05.88 if関数ったって組み込みの(型クラスを含む)条件分岐機構を使わずには書けんだろ。
143デフォルトの名無しさん
2012/03/04(日) 11:39:11.04 >>140知らなかったので、検索して目次を眺めてみたが、スレタイのような議論をするなら読むべきかと思った。
144デフォルトの名無しさん
2012/03/04(日) 11:44:07.10 >>142 ARMなら条件分岐なしのコードにコンパイルできるんでね?
145デフォルトの名無しさん
2012/03/04(日) 11:48:48.15 >>142
へ?
パターンマッチとガードでごく普通の関数として書けるけど
型クラスなんて大仰なもん使わんよ
と言うか、ifが普通に書けるのが遅延評価と関数もファーストクラスの値っていう特徴の賜物じゃないか
if flg t f | flg == True = t
| flg == False = f
関数型言語は必ず値を返すって性質上、if elseしか許されないが
先行評価のだと、両方とも関数を受け取った時点で評価前に実行されちゃうから正しく動かない
(評価前に両方実行されて、評価後にどちらかが実行される)
へ?
パターンマッチとガードでごく普通の関数として書けるけど
型クラスなんて大仰なもん使わんよ
と言うか、ifが普通に書けるのが遅延評価と関数もファーストクラスの値っていう特徴の賜物じゃないか
if flg t f | flg == True = t
| flg == False = f
関数型言語は必ず値を返すって性質上、if elseしか許されないが
先行評価のだと、両方とも関数を受け取った時点で評価前に実行されちゃうから正しく動かない
(評価前に両方実行されて、評価後にどちらかが実行される)
146デフォルトの名無しさん
2012/03/04(日) 12:02:53.04 つーか、関数型言語の利点と言えば、バグが無いことを保障できるって事じゃね?
数学の証明で公式が永遠に正しいことを保障するのと同じで、関数にバグが無いこと保証できれば、その関数の使い方を間違わなければ、その関数が原因のバグは無いと保証できる
数学の証明で公式が永遠に正しいことを保障するのと同じで、関数にバグが無いこと保証できれば、その関数の使い方を間違わなければ、その関数が原因のバグは無いと保証できる
147デフォルトの名無しさん
2012/03/04(日) 12:08:56.91 分岐を関数で表現するのは難しくない。
T(x,y)=x
F(x,y)=y
IF(c,x,y)=c(x,y)
最後のは糖衣構文で、cはTかFが入る。
問題はこれを先行評価すると、
xの評価、yの評価、どっちかの選択と
進行してしまい、無駄な評価またはやっては
ならない評価をしてしまうことになる。
遅延評価では必要になるまで引数は評価されず、
c(x,y)にはxかyの一方しか含まれないので、
上記の問題は起こらない。
T(x,y)=x
F(x,y)=y
IF(c,x,y)=c(x,y)
最後のは糖衣構文で、cはTかFが入る。
問題はこれを先行評価すると、
xの評価、yの評価、どっちかの選択と
進行してしまい、無駄な評価またはやっては
ならない評価をしてしまうことになる。
遅延評価では必要になるまで引数は評価されず、
c(x,y)にはxかyの一方しか含まれないので、
上記の問題は起こらない。
148デフォルトの名無しさん
2012/03/04(日) 12:10:17.75 すでにコメントされていたか。
149デフォルトの名無しさん
2012/03/04(日) 13:14:45.06 元ネタ書いたの誰か知らんが >>125 は酷すぎる。
上下に並べている壁が、それぞれ軸が違う。
壁2は型システムの問題だろ。
壁4も意味不明。
末尾再帰最適化の有無を越えられない壁とか書いてるのもアホ丸出し。
末尾再帰になるような処理は手続き型なら最初からループで書く方が自然。
だから要らないだけ。
上下に並べている壁が、それぞれ軸が違う。
壁2は型システムの問題だろ。
壁4も意味不明。
末尾再帰最適化の有無を越えられない壁とか書いてるのもアホ丸出し。
末尾再帰になるような処理は手続き型なら最初からループで書く方が自然。
だから要らないだけ。
150デフォルトの名無しさん
2012/03/04(日) 13:24:51.24 型推論とオブジェクトの相性の悪さが問題だな
誤解を恐れずざっくり切るなら、
オブジェクト指向が適している分野に関数型言語は不適。
誤解を恐れずざっくり切るなら、
オブジェクト指向が適している分野に関数型言語は不適。
151デフォルトの名無しさん
2012/03/04(日) 14:09:20.29 せんせー、OCamlさんが泣いてます
152デフォルトの名無しさん
2012/03/04(日) 14:12:58.24153デフォルトの名無しさん
2012/03/04(日) 15:30:46.23 >>147
Smalltalkの宣伝乙w
Smalltalkの宣伝乙w
154デフォルトの名無しさん
2012/03/04(日) 16:33:15.37 一般論を書いたつもりだがどの部分がsmalltalk?
155デフォルトの名無しさん
2012/03/04(日) 16:34:41.05 一般論を書いたつもりだがどの部分がsmalltalk?
156デフォルトの名無しさん
2012/03/04(日) 17:05:02.03 T(x,y)=xがTrueクラスの定義
F(x,y)=yがTrueクラスの定義
IF(c,x,y)=c(x,y)がメソッドの動的束縛に相当した実装になっている。
具体的には、if式はifTrue:ifFalse:というメソッドで実装されている。
これがTrueクラスでは、第1引数のクロージャを評価するよう定義されていて、
Falseクラスでは、第2引数のクロージャを評価するよう定義されている。
クライアントコードでは例えば
x = y ifTrue: [do something] ifFalse: [ do something else]
というメッセージ式を評価する時に、
x=yがtrueならTrueクラスのifTrue:ifFalse:が束縛されて
第1引数の[do something]が評価される。([ ]で囲まれたものはクロージャ)
x=yがfalseならFalseクラスのifTrue:ifFalse:が束縛されて
第2引数の[do something else]が評価される。
F(x,y)=yがTrueクラスの定義
IF(c,x,y)=c(x,y)がメソッドの動的束縛に相当した実装になっている。
具体的には、if式はifTrue:ifFalse:というメソッドで実装されている。
これがTrueクラスでは、第1引数のクロージャを評価するよう定義されていて、
Falseクラスでは、第2引数のクロージャを評価するよう定義されている。
クライアントコードでは例えば
x = y ifTrue: [do something] ifFalse: [ do something else]
というメッセージ式を評価する時に、
x=yがtrueならTrueクラスのifTrue:ifFalse:が束縛されて
第1引数の[do something]が評価される。([ ]で囲まれたものはクロージャ)
x=yがfalseならFalseクラスのifTrue:ifFalse:が束縛されて
第2引数の[do something else]が評価される。
157デフォルトの名無しさん
2012/03/04(日) 17:09:34.66158デフォルトの名無しさん
2012/03/04(日) 17:15:42.28159デフォルトの名無しさん
2012/03/04(日) 17:58:15.02 悪いけどJava屋の俺からするとSmalltalkの人も同じだよ。
>上から目線で小馬鹿にする
>上から目線で小馬鹿にする
160デフォルトの名無しさん
2012/03/04(日) 18:26:49.16 どっちも原理主義者で純血主義者ですもんね
161デフォルトの名無しさん
2012/03/04(日) 18:31:16.56 ハスケラやSmallTalkはわかるがLISPerは純血主義の対極だろw
162デフォルトの名無しさん
2012/03/04(日) 18:32:18.55 LispもHaskellも習得のコストさえ無視できれば
言語自体には使う価値があるけど
Smalltalkには何も無い
言語自体には使う価値があるけど
Smalltalkには何も無い
163デフォルトの名無しさん
2012/03/04(日) 18:35:31.08 よほどSmallTalkに叩かれた暗い過去があるんだねw
もしかしてIDEスレじゃね?ぷぷぷ あのスレのジャバ厨は悲惨だったww
もしかしてIDEスレじゃね?ぷぷぷ あのスレのジャバ厨は悲惨だったww
164デフォルトの名無しさん
2012/03/04(日) 18:38:27.75 そんなにスモールトーク叩きたければ別スレ立てれば?
スレ違いウザw よほど悔しかったんだねww
スレ違いウザw よほど悔しかったんだねww
165デフォルトの名無しさん
2012/03/04(日) 18:52:32.40 Smalltalkを頭ごなしに馬鹿にする奴でSmalltalkをまともに使ったことある奴を見たことがない。
166デフォルトの名無しさん
2012/03/04(日) 18:52:47.01 Pharoがゴミ過ぎて笑える
玩具で喜んでて滑稽
玩具で喜んでて滑稽
167デフォルトの名無しさん
2012/03/04(日) 19:25:33.87 負け犬>>166の遠吠え
168デフォルトの名無しさん
2012/03/04(日) 19:31:38.94 「俺は世間の奴らとは違う」という自尊心を満たすために
マイナーなものを選択するという変な層がいるから性質が悪い。
そういう人にとっては「世間はJava」でなければ困るわけだ。
「RubyでもJavaScriptでも普通に関数的にも書ける」と言われると
「中には手続き型言語で関数的に書いている人もいるだろうが、
それは(俺と同じ)一部の先進的な層で、世間一般はJavaだろ」
という主張をしてくる。自分が特殊でありさえすれば何でもいいというね。
マイナーなものを選択するという変な層がいるから性質が悪い。
そういう人にとっては「世間はJava」でなければ困るわけだ。
「RubyでもJavaScriptでも普通に関数的にも書ける」と言われると
「中には手続き型言語で関数的に書いている人もいるだろうが、
それは(俺と同じ)一部の先進的な層で、世間一般はJavaだろ」
という主張をしてくる。自分が特殊でありさえすれば何でもいいというね。
169デフォルトの名無しさん
2012/03/04(日) 19:32:43.55 自己紹介乙としか言いようがないw
170デフォルトの名無しさん
2012/03/04(日) 19:36:03.72 関数型言語由来の機能で便利なところってのはクロージャとラムダ。
それはもう手続き型言語で普通に使える。
関数型言語の便利な機能は、
既にメインストリームである手続き型言語に取り込まれ、
今では世間一般のプログラマも当たり前に関数的な書き方をするようになっている。
めでたしめでたし。
現実的には、もうこれで終了してる話だろ。
それはもう手続き型言語で普通に使える。
関数型言語の便利な機能は、
既にメインストリームである手続き型言語に取り込まれ、
今では世間一般のプログラマも当たり前に関数的な書き方をするようになっている。
めでたしめでたし。
現実的には、もうこれで終了してる話だろ。
171デフォルトの名無しさん
2012/03/04(日) 19:40:26.99 パターンマッチは便利なので手続き型言語にも取り込んでほしい
で、パターンマッチは再帰と相性良いので、
ついでに末尾再帰最適化も取り込んでほしい
汎用的な関数から具体的な関数を定義するのに
カリー化は便利なので是非とりこんで欲しい
で、パターンマッチは再帰と相性良いので、
ついでに末尾再帰最適化も取り込んでほしい
汎用的な関数から具体的な関数を定義するのに
カリー化は便利なので是非とりこんで欲しい
172デフォルトの名無しさん
2012/03/04(日) 19:44:07.49173デフォルトの名無しさん
2012/03/04(日) 19:45:55.21 >汎用的な関数から具体的な関数を定義するのに
>カリー化は便利なので是非とりこんで欲しい
こういう奴にカリー化という包丁を渡すと
オレオレ高階関数ライブラリを作り始めて
メンテナンス不可能なコードを量産されるのがオチ。
>カリー化は便利なので是非とりこんで欲しい
こういう奴にカリー化という包丁を渡すと
オレオレ高階関数ライブラリを作り始めて
メンテナンス不可能なコードを量産されるのがオチ。
174デフォルトの名無しさん
2012/03/04(日) 19:46:26.79 逆にダックタイピングは便利なので関数型言語にも取り込んでほしい
175デフォルトの名無しさん
2012/03/04(日) 19:46:46.00 あ、型推論できないから取り込めませんね。失礼
176デフォルトの名無しさん
2012/03/04(日) 20:08:21.74177デフォルトの名無しさん
2012/03/04(日) 20:09:50.08 >>174はダックタイピングの誤用だな
178デフォルトの名無しさん
2012/03/04(日) 20:10:17.57179デフォルトの名無しさん
2012/03/04(日) 20:13:10.92 パターンマッチと再帰は無関係だし
視野が狭すぎ
視野が狭すぎ
180デフォルトの名無しさん
2012/03/04(日) 20:13:25.44 代数的データ型使わないのにパターンマッチがあっても何も嬉しくない
181デフォルトの名無しさん
2012/03/04(日) 20:34:02.85 代数データ型と再帰構造は直交する概念だろw
どこまで視野が狭いんだかw
どこまで視野が狭いんだかw
182デフォルトの名無しさん
2012/03/04(日) 20:41:34.43 >代数データ型と再帰構造は直交する概念だろw
>どこまで視野が狭いんだかw
何それ?
代数データ型を使って
再帰構造を表現することはできないって事?
>どこまで視野が狭いんだかw
何それ?
代数データ型を使って
再帰構造を表現することはできないって事?
183デフォルトの名無しさん
2012/03/04(日) 20:52:20.17 便利な機能が全部ある言語を選んだらHaskellになった
184デフォルトの名無しさん
2012/03/04(日) 20:56:43.28 いらない機能を全部つめこんだらSmalltalkになった
185デフォルトの名無しさん
2012/03/04(日) 21:41:23.88186デフォルトの名無しさん
2012/03/04(日) 21:48:35.10 >>156
ありがとうございます。
Smalltalkって、C++やJavaの先祖くらいにしか思っていなかったけれども、
結構おもしろいですね。FPとOOPはレイヤーを積み重ねると互いに相手を
模倣できるという話を聞いたことがあるが、Smalltalkを学習すると
その意味がわかるのではないかという気がした。
ありがとうございます。
Smalltalkって、C++やJavaの先祖くらいにしか思っていなかったけれども、
結構おもしろいですね。FPとOOPはレイヤーを積み重ねると互いに相手を
模倣できるという話を聞いたことがあるが、Smalltalkを学習すると
その意味がわかるのではないかという気がした。
187デフォルトの名無しさん
2012/03/04(日) 21:58:32.05 あちこちのスレを読んでいると、
Smalltalkの説明に対してだけ、丁寧な言葉でお礼が書き込まれることが多い。
この傾向が、とても面白いと思う。
Smalltalkの説明に対してだけ、丁寧な言葉でお礼が書き込まれることが多い。
この傾向が、とても面白いと思う。
188デフォルトの名無しさん
2012/03/04(日) 22:04:24.12 > 関数型言語由来の機能で便利なところってのはクロージャとラムダ。
> それはもう手続き型言語で普通に使える。
体験するにはどういう言語がいい?知っている範囲では、
C++11: lambdaはあるが、スコープにかんするオプションがいっぱいあって
頭痛がしてきた。
Fortran: Intel拡張に限り、内部手続きが渡せるのでクロージャが部分的に
はあるといえる。うっかり使ってしまうとSparcマシンに移したときに
がっくりくる。
> それはもう手続き型言語で普通に使える。
体験するにはどういう言語がいい?知っている範囲では、
C++11: lambdaはあるが、スコープにかんするオプションがいっぱいあって
頭痛がしてきた。
Fortran: Intel拡張に限り、内部手続きが渡せるのでクロージャが部分的に
はあるといえる。うっかり使ってしまうとSparcマシンに移したときに
がっくりくる。
189デフォルトの名無しさん
2012/03/04(日) 22:25:37.67 結局はどの言語を使うかではなく、関数型的な考え方書き方が出来るかどうか、が問題になってくんだろうかね?
190デフォルトの名無しさん
2012/03/04(日) 22:39:54.94 できなくても、ほとんど問題がないのが現実
191デフォルトの名無しさん
2012/03/05(月) 00:18:07.30192デフォルトの名無しさん
2012/03/05(月) 01:21:20.77 マルチスレッドでオブジェクト指向型言語の限界が見えてきたから、関数型言語が注目されだしたんじゃなかったっけ
まあ、遅延評価とマルチスレッドプログラミングは相性が悪いらしいので、最適化でマルチスレッドの時だけ正格評価にしようかという話はどっかで見た気がするが
それでも、純粋な関数に関しては
hoge リスト1 リスト2 = (force リスト1) `par`
(force リスト2) `par`
以下は普通のhoge関数と同じ
force [] = ()
force (x:xs) = x `pseq` force xs
これでおk
※ghcバージョンによって、par/pseq関数を読み込むモジュールの場所がまちまち・・・
マルチスレッドの時だけ正格評価になるなら、force関数書かなくて良くなるだけで、たいした手間でもない
同期もデッドロックも気にしなくて良いのが楽
(スレッド数は実行ファイルにランタイムへの指示として指定する)
まあ、遅延評価とマルチスレッドプログラミングは相性が悪いらしいので、最適化でマルチスレッドの時だけ正格評価にしようかという話はどっかで見た気がするが
それでも、純粋な関数に関しては
hoge リスト1 リスト2 = (force リスト1) `par`
(force リスト2) `par`
以下は普通のhoge関数と同じ
force [] = ()
force (x:xs) = x `pseq` force xs
これでおk
※ghcバージョンによって、par/pseq関数を読み込むモジュールの場所がまちまち・・・
マルチスレッドの時だけ正格評価になるなら、force関数書かなくて良くなるだけで、たいした手間でもない
同期もデッドロックも気にしなくて良いのが楽
(スレッド数は実行ファイルにランタイムへの指示として指定する)
193デフォルトの名無しさん
2012/03/05(月) 08:59:09.17194デフォルトの名無しさん
2012/03/05(月) 10:15:45.33 一応増やせはするんだけど、
一度増やすと今度は減らせないんだよねえ・・・
そのうち改善はされるかもしれないのだけど
一度増やすと今度は減らせないんだよねえ・・・
そのうち改善はされるかもしれないのだけど
195デフォルトの名無しさん
2012/03/05(月) 11:03:41.23 一般に一旦プロセスに割り当てたリソースをひっぺがすのは難しい
196デフォルトの名無しさん
2012/03/06(火) 00:05:57.69 並列計算でスレッド数をcpuのコア数以外にすることがあまりないので、
よくわからないのだが、OpenMPのようにいったんスレッドを畳んで、
スレッド数を指定して再度スレッドを起動するのは難しいのかな。
リストなので単純にはいかないとおもうが、
!$omp parallel map
ys = map f xs
!$omp end parallel map
とかできるようになると結構うれしい。
よくわからないのだが、OpenMPのようにいったんスレッドを畳んで、
スレッド数を指定して再度スレッドを起動するのは難しいのかな。
リストなので単純にはいかないとおもうが、
!$omp parallel map
ys = map f xs
!$omp end parallel map
とかできるようになると結構うれしい。
197デフォルトの名無しさん
2012/03/06(火) 12:16:08.90 ユーザスレッドを駆動するネイティブスレッド数の話だろ?
なら、動的な変更はそれほど必要ないんじゃ?
なら、動的な変更はそれほど必要ないんじゃ?
198デフォルトの名無しさん
2012/03/21(水) 18:05:47.79 不毛だな
199デフォルトの名無しさん
2012/03/21(水) 18:25:40.67 ふもっふ
200デフォルトの名無しさん
2012/03/22(木) 18:21:07.48 catコマンドって、意外と奥が深いんだな・・・
こんなの見つけたんだけど(haskell)、他の言語だとどう書くの?
A cat in Haskell
http://madscientist.jp/~ikegami/diary/20050728.html#p01
ちなみに、このページはここからリンクされてた
Haskell
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Haskell
cat(オプション付き)って所
こんなの見つけたんだけど(haskell)、他の言語だとどう書くの?
A cat in Haskell
http://madscientist.jp/~ikegami/diary/20050728.html#p01
ちなみに、このページはここからリンクされてた
Haskell
http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=Haskell
cat(オプション付き)って所
201デフォルトの名無しさん
2012/03/22(木) 22:41:57.77 >>200
オプション無しの、単純に引数のファイルを繋いで出力するだけのものなら
AWK、Perl、Ruby辺りはアホみたいに短いな
(コマンド名含めて数バイト)
流石に複雑なオプション含むとそこまで差は出ないかも知れんが
オプション無しの、単純に引数のファイルを繋いで出力するだけのものなら
AWK、Perl、Ruby辺りはアホみたいに短いな
(コマンド名含めて数バイト)
流石に複雑なオプション含むとそこまで差は出ないかも知れんが
202デフォルトの名無しさん
2012/03/23(金) 09:05:32.57 >>200
正規表現を並べただけだけど、Perl だとこんなかんじ。
http://ideone.com/BCiGc
とりあえず -u と -v のメタ表示以外サポート(もとの Haskell でも
サポートしてなかったので)。
正規表現を並べただけだけど、Perl だとこんなかんじ。
http://ideone.com/BCiGc
とりあえず -u と -v のメタ表示以外サポート(もとの Haskell でも
サポートしてなかったので)。
203デフォルトの名無しさん
2012/03/23(金) 12:57:34.26 ちなみに Snow Leopard の cat には -A -E -T が存在しなかった。
Lion 以降?
Lion 以降?
204デフォルトの名無しさん
2012/03/23(金) 13:38:23.23 >>201
オプション無しだとスクリプト言語よりは長いものの、静的型言語としては短いだろうな
と言うか、ここの一番上のruby版catは短すぎてなにやってるのか分からん
下2つのcatコードの方がコードの意図を読み易いな
http://www2.atwiki.jp/kmo2/m/pages/17.html
import System.Environment
main = getArgs >>= mapM readFile >>= putStrLn.unlines
奇しくも、do構文で見えにくい状態移管が見えやすい形になった
オプション無しだとスクリプト言語よりは長いものの、静的型言語としては短いだろうな
と言うか、ここの一番上のruby版catは短すぎてなにやってるのか分からん
下2つのcatコードの方がコードの意図を読み易いな
http://www2.atwiki.jp/kmo2/m/pages/17.html
import System.Environment
main = getArgs >>= mapM readFile >>= putStrLn.unlines
奇しくも、do構文で見えにくい状態移管が見えやすい形になった
205デフォルトの名無しさん
2012/03/23(金) 14:00:00.76 とりあえず >>200 のバグ。
1. -v と -t の結果が同じになる。本物の cat は -v では TAB を変更しない。
2. 入力が改行で終わっていないときに、勝手に改行を追加してしまう。
3. -e をつけたときに、入力が改行で終わっていなくても最後に $ をつける。
1. -v と -t の結果が同じになる。本物の cat は -v では TAB を変更しない。
2. 入力が改行で終わっていないときに、勝手に改行を追加してしまう。
3. -e をつけたときに、入力が改行で終わっていなくても最後に $ をつける。
206デフォルトの名無しさん
2012/03/23(金) 14:18:13.40207デフォルトの名無しさん
2012/03/24(土) 00:35:00.64 >>204
> while gets do puts $_ end
これのことか?Perlじみた動きをするコードだね
getsは一行入力する
EOFならnil、入力があればそれを文字列型として
グローバル変数 $_ に突っ込むと共に、戻り値としても返す
Rubyの文字列型は必ず真であり、逆にnilは必ず偽なので
while gets は「EOFになるまで毎行を $_ として繰り返す」イディオムになる
あとはそれをputsで出力してるだけ
> while gets do puts $_ end
これのことか?Perlじみた動きをするコードだね
getsは一行入力する
EOFならnil、入力があればそれを文字列型として
グローバル変数 $_ に突っ込むと共に、戻り値としても返す
Rubyの文字列型は必ず真であり、逆にnilは必ず偽なので
while gets は「EOFになるまで毎行を $_ として繰り返す」イディオムになる
あとはそれをputsで出力してるだけ
208デフォルトの名無しさん
2012/03/24(土) 02:18:53.77209デフォルトの名無しさん
2012/03/24(土) 03:35:25.94 昔はプログラム側でファイルを開いたりしないものだったので、
たんに伝統的なやり方とも言える。
たんに伝統的なやり方とも言える。
210デフォルトの名無しさん
2012/03/24(土) 13:41:01.22 >>208
? 標準入力とファイル読み込みの区別はむしろしっかりされてるコードだと思うけど…
ファイルからの読み込みならいきなりgetsなんて書かないよ
その場合はファイルを開いて、それに対してメソッド呼ぶのが基本
標準入力から読むからこそいきなりgetsを書く
まあ確かにgetsの読み先をファイルに繋ぎかえることも出来るし
逆に標準入力をIOオブジェクトとしてメソッド呼ぶとかも出来るけど
このコードではそんなことしてないっしょ?
? 標準入力とファイル読み込みの区別はむしろしっかりされてるコードだと思うけど…
ファイルからの読み込みならいきなりgetsなんて書かないよ
その場合はファイルを開いて、それに対してメソッド呼ぶのが基本
標準入力から読むからこそいきなりgetsを書く
まあ確かにgetsの読み先をファイルに繋ぎかえることも出来るし
逆に標準入力をIOオブジェクトとしてメソッド呼ぶとかも出来るけど
このコードではそんなことしてないっしょ?
211デフォルトの名無しさん
2012/03/24(土) 13:43:10.83 ああ、ごめんそゆことか
標準入力じゃなくてARGFからの読み込みの話だったね
ええとgetsは既定ではARGFから読む
んで、その内容はファイルを渡していないなら標準入力、渡されればそのファイルを全て繋いだものになる
標準入力じゃなくてARGFからの読み込みの話だったね
ええとgetsは既定ではARGFから読む
んで、その内容はファイルを渡していないなら標準入力、渡されればそのファイルを全て繋いだものになる
212デフォルトの名無しさん
2012/03/24(土) 13:45:09.34 多分Perlの<>辺りがARGFの由来だろうなあ
213デフォルトの名無しさん
2012/03/24(土) 14:39:52.21 >>211
HPに説明があったから良かったものの、所見であのコードだけ見てたら混乱してた
個人的には、>>204のページ探してるときに見つけた
http://uch-x40.seesaa.net/article/22908221.html
こっちのページのやり方の方が好きかな
このページのprintをputsにするだけで問題解決するんじゃないか?と思ったので、久しぶりにruby入れて試してみたら、
予想通り解決した
puts ARGF.read
これで、
>ruby cat.rb mycat.hs myecho.hs
import System.Environment
import System.IO
main = getArgs >>= mapM readFile >>= putStrLn.unlines
import System.Environment
main = getArgs >>= putStrLn.unwords
Haskell版と、ちょっと挙動が違うけど・・・
(Haskell版のputStrLnをputStrに変えれば同じになるけど、どっちが正しい挙動なんだろ)
HPに説明があったから良かったものの、所見であのコードだけ見てたら混乱してた
個人的には、>>204のページ探してるときに見つけた
http://uch-x40.seesaa.net/article/22908221.html
こっちのページのやり方の方が好きかな
このページのprintをputsにするだけで問題解決するんじゃないか?と思ったので、久しぶりにruby入れて試してみたら、
予想通り解決した
puts ARGF.read
これで、
>ruby cat.rb mycat.hs myecho.hs
import System.Environment
import System.IO
main = getArgs >>= mapM readFile >>= putStrLn.unlines
import System.Environment
main = getArgs >>= putStrLn.unwords
Haskell版と、ちょっと挙動が違うけど・・・
(Haskell版のputStrLnをputStrに変えれば同じになるけど、どっちが正しい挙動なんだろ)
214デフォルトの名無しさん
2012/03/24(土) 14:55:21.83 あー・・・ごめん
ruby版、問題解決してないや
EOFで改行されないから、
import System.Environment
import System.IO
main = getArgs >>= mapM readFile >>= putStrLn.unlines[EOF]<-ここにEOFがある
この条件だと下のような表示になる
import System.Environment
import System.IO
↓ここから次のファイルが始まる
main = getArgs >>= mapM readFile >>= putStrLn.unlinesimport System.Environment
main = getArgs >>= putStrLn.unwords
ruby版、問題解決してないや
EOFで改行されないから、
import System.Environment
import System.IO
main = getArgs >>= mapM readFile >>= putStrLn.unlines[EOF]<-ここにEOFがある
この条件だと下のような表示になる
import System.Environment
import System.IO
↓ここから次のファイルが始まる
main = getArgs >>= mapM readFile >>= putStrLn.unlinesimport System.Environment
main = getArgs >>= putStrLn.unwords
215デフォルトの名無しさん
2012/03/24(土) 14:57:07.40 実行結果の書き直し・・・半角スペースは消えるんだった・・・orz
import System.Environment
import System.IO
↓ここから次のファイルが始まる
main = getArgs >>= mapM readFile >>= putStrLn.unlinesimport System.Environment
main = getArgs >>= putStrLn.unwords
import System.Environment
import System.IO
↓ここから次のファイルが始まる
main = getArgs >>= mapM readFile >>= putStrLn.unlinesimport System.Environment
main = getArgs >>= putStrLn.unwords
216デフォルトの名無しさん
2012/03/24(土) 18:31:27.36 >>213-215
率直に言う
関数型言語が使える使えないうんぬんの前に、常識的な(日本語の)文章表現を使えるようになれ
単にコードをコピペしただけで、自分の意図が相手に通じると考えるな
まともなヤシなら以下のような推論を自然に行って、それを文章で表現できる
・.... を期待して ..... という条件で (* 仮説1 *)
・..... というコードを試したが.....となり、期待にそぐわなかった -- (* 実験1 *)
・おそらく ..... が原因ではないかと思う (* 帰納1 *)
・そこで、新たに .... を期待して ..... という条件で (* 仮説2 *)
・..... というコードを試したところ .....となり、期待どおりの結果を得た -- (* 実験2 *)
ここまで言って分からなければ、お前さんは重症の「ハスケラ症」患者であり、
本人には自覚できない深刻なコミュニケーション不全の状態にある
とっとと隔離病棟(=Haskell本スレ)に戻ってオナニーでもしてるのがお似合い
率直に言う
関数型言語が使える使えないうんぬんの前に、常識的な(日本語の)文章表現を使えるようになれ
単にコードをコピペしただけで、自分の意図が相手に通じると考えるな
まともなヤシなら以下のような推論を自然に行って、それを文章で表現できる
・.... を期待して ..... という条件で (* 仮説1 *)
・..... というコードを試したが.....となり、期待にそぐわなかった -- (* 実験1 *)
・おそらく ..... が原因ではないかと思う (* 帰納1 *)
・そこで、新たに .... を期待して ..... という条件で (* 仮説2 *)
・..... というコードを試したところ .....となり、期待どおりの結果を得た -- (* 実験2 *)
ここまで言って分からなければ、お前さんは重症の「ハスケラ症」患者であり、
本人には自覚できない深刻なコミュニケーション不全の状態にある
とっとと隔離病棟(=Haskell本スレ)に戻ってオナニーでもしてるのがお似合い
217デフォルトの名無しさん
2012/03/24(土) 19:37:53.91 このスレが隔離病棟だという認識がない、ってあたりが重症だなw
218デフォルトの名無しさん
2012/03/27(火) 06:31:27.90 型は制約 #プログラミング初心者のミス
↑
Zermeloを初心者呼ばわり、ワロスw
↑
Zermeloを初心者呼ばわり、ワロスw
219デフォルトの名無しさん
2012/03/27(火) 08:06:51.40 型付集合論自体がラッセルの逆説を回避するための制約ですし.
220デフォルトの名無しさん
2012/03/27(火) 10:42:27.74 disることでしかアイデンティティを保てない可哀相な奴なんだよ。
221デフォルトの名無しさん
2012/03/27(火) 10:47:08.52 オブジェクト指向 #プログラミング初心者のミス ←これとか
222デフォルトの名無しさん
2012/03/27(火) 20:07:43.04 いやオブジェクト指向は糞
223デフォルトの名無しさん
2012/03/28(水) 15:50:23.80 そうそうクラスとかインスタンスとかメソッドとかの用語を使う言語は100%糞!
224デフォルトの名無しさん
2012/03/28(水) 17:07:26.99 いまどきは、組み込みみたいなリソースの厳しい案件でも使うけどな。
225デフォルトの名無しさん
2012/03/28(水) 17:35:45.66 オブジェクト指向言語は使わなくても、設計では使うだろ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 [蚤の市★]
- 高市首相の答弁書に「台湾有事答えない」と明記 存立危機発言当時 ★3 [蚤の市★]
- 「もうキモくてキモくて…」29歳女性が語る“おぢアタック”の実態。「俺ならイケるかも」年下女性を狙う勘違い中年男性に共通点が★5 [Hitzeschleier★]
- 「偽サッチャー」「自滅的」「時代遅れ」 高市首相の経済政策を海外メディアが酷評 ★2 [蚤の市★]
- 【ド軍】山本由伸、WBC出場を決断!ドジャースが本人の意向を尊重、佐々木朗希はチームが故障歴を懸念で不参加 [鉄チーズ烏★]
- 米大統領報道官「日本と強固な同盟維持、中国とも協力」 [少考さん★]
- 竹中平蔵「日米が長年守り続けてき台湾有事に関する曖昧戦略の知恵を一瞬にして無にさせた岡田の責任は非常に重い」 [271912485]
- 大谷翔平みたいな女wwwwwwwwwwwwwwwwwwwww
- (´・ω・`)おっはー
- 中国人、超ド正論。「チベットやウイグルに住んでるのはチベット族やウイグル族だが、アイヌから奪った土地に住んでる日本人こそ侵略者」 [314039747]
- JR赤羽駅の東口を出たらそこはアタシの庭…
- 今年の漢字はおそらく「肛門」
