【アンチ】関数型言語は使えない【玩具】 2

■ このスレッドは過去ログ倉庫に格納されています
2012/02/28(火) 20:45:47.95
前スレ
http://toro.2ch.net/test/read.cgi/tech/1320743217/
2012/03/04(日) 19:31:38.94
「俺は世間の奴らとは違う」という自尊心を満たすために
マイナーなものを選択するという変な層がいるから性質が悪い。

そういう人にとっては「世間はJava」でなければ困るわけだ。
「RubyでもJavaScriptでも普通に関数的にも書ける」と言われると

「中には手続き型言語で関数的に書いている人もいるだろうが、
それは(俺と同じ)一部の先進的な層で、世間一般はJavaだろ」

という主張をしてくる。自分が特殊でありさえすれば何でもいいというね。
2012/03/04(日) 19:32:43.55
自己紹介乙としか言いようがないw
2012/03/04(日) 19:36:03.72
関数型言語由来の機能で便利なところってのはクロージャとラムダ。
それはもう手続き型言語で普通に使える。

関数型言語の便利な機能は、
既にメインストリームである手続き型言語に取り込まれ、
今では世間一般のプログラマも当たり前に関数的な書き方をするようになっている。
めでたしめでたし。

現実的には、もうこれで終了してる話だろ。
2012/03/04(日) 19:40:26.99
パターンマッチは便利なので手続き型言語にも取り込んでほしい

で、パターンマッチは再帰と相性良いので、
ついでに末尾再帰最適化も取り込んでほしい

汎用的な関数から具体的な関数を定義するのに
カリー化は便利なので是非とりこんで欲しい
2012/03/04(日) 19:44:07.49
>>171
末尾再帰最適化はC/C++でやってるし
上でも出てるけど関数型とは無関係
2012/03/04(日) 19:45:55.21
>汎用的な関数から具体的な関数を定義するのに
>カリー化は便利なので是非とりこんで欲しい

こういう奴にカリー化という包丁を渡すと
オレオレ高階関数ライブラリを作り始めて
メンテナンス不可能なコードを量産されるのがオチ。
2012/03/04(日) 19:46:26.79
逆にダックタイピングは便利なので関数型言語にも取り込んでほしい
2012/03/04(日) 19:46:46.00
あ、型推論できないから取り込めませんね。失礼
2012/03/04(日) 20:08:21.74
>>175
構造的部分型で良ければOCamlで出来るけどな > ダックタイピング
もちろん型推論もできる
2012/03/04(日) 20:09:50.08
>>174はダックタイピングの誤用だな
2012/03/04(日) 20:10:17.57
>>172
パターンマッチ無いのに末尾再帰最適化だけ出来ても
正直そんなに嬉しくない
2012/03/04(日) 20:13:10.92
パターンマッチと再帰は無関係だし
視野が狭すぎ
2012/03/04(日) 20:13:25.44
代数的データ型使わないのにパターンマッチがあっても何も嬉しくない
2012/03/04(日) 20:34:02.85
代数データ型と再帰構造は直交する概念だろw
どこまで視野が狭いんだかw
2012/03/04(日) 20:41:34.43
>代数データ型と再帰構造は直交する概念だろw
>どこまで視野が狭いんだかw

何それ?
代数データ型を使って
再帰構造を表現することはできないって事?
2012/03/04(日) 20:52:20.17
便利な機能が全部ある言語を選んだらHaskellになった
2012/03/04(日) 20:56:43.28
いらない機能を全部つめこんだらSmalltalkになった
2012/03/04(日) 21:41:23.88
>>181
パターンマッチと再帰は直交する
代数的データ構造と再帰は直交する
パターンマッチと代数的データ構造は直交しない
186デフォルトの名無しさん
垢版 |
2012/03/04(日) 21:48:35.10
>>156
ありがとうございます。
Smalltalkって、C++やJavaの先祖くらいにしか思っていなかったけれども、
結構おもしろいですね。FPとOOPはレイヤーを積み重ねると互いに相手を
模倣できるという話を聞いたことがあるが、Smalltalkを学習すると
その意味がわかるのではないかという気がした。
2012/03/04(日) 21:58:32.05
あちこちのスレを読んでいると、
Smalltalkの説明に対してだけ、丁寧な言葉でお礼が書き込まれることが多い。
この傾向が、とても面白いと思う。
188デフォルトの名無しさん
垢版 |
2012/03/04(日) 22:04:24.12
> 関数型言語由来の機能で便利なところってのはクロージャとラムダ。
> それはもう手続き型言語で普通に使える。
体験するにはどういう言語がいい?知っている範囲では、
C++11: lambdaはあるが、スコープにかんするオプションがいっぱいあって
 頭痛がしてきた。
Fortran: Intel拡張に限り、内部手続きが渡せるのでクロージャが部分的に
 はあるといえる。うっかり使ってしまうとSparcマシンに移したときに
 がっくりくる。


2012/03/04(日) 22:25:37.67
結局はどの言語を使うかではなく、関数型的な考え方書き方が出来るかどうか、が問題になってくんだろうかね?
2012/03/04(日) 22:39:54.94
できなくても、ほとんど問題がないのが現実
2012/03/05(月) 00:18:07.30
>>166
Smalltalkといっても、実験的要素の多いSqueakやPharoとかばかりじゃなく、
VisualWorksとかDolphinみたいに商用志向の比較的作り込んである処理系もあるよ。
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関数書かなくて良くなるだけで、たいした手間でもない
同期もデッドロックも気にしなくて良いのが楽
(スレッド数は実行ファイルにランタイムへの指示として指定する)

2012/03/05(月) 08:59:09.17
>>192
実行ファイル単位でしかスレッド数を決められないのか
イマイチだな…
2012/03/05(月) 10:15:45.33
一応増やせはするんだけど、
一度増やすと今度は減らせないんだよねえ・・・
そのうち改善はされるかもしれないのだけど
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
とかできるようになると結構うれしい。
2012/03/06(火) 12:16:08.90
ユーザスレッドを駆動するネイティブスレッド数の話だろ?
なら、動的な変更はそれほど必要ないんじゃ?
198デフォルトの名無しさん
垢版 |
2012/03/21(水) 18:05:47.79
不毛だな
2012/03/21(水) 18:25:40.67
ふもっふ
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(オプション付き)って所
2012/03/22(木) 22:41:57.77
>>200
オプション無しの、単純に引数のファイルを繋いで出力するだけのものなら
AWK、Perl、Ruby辺りはアホみたいに短いな
(コマンド名含めて数バイト)
流石に複雑なオプション含むとそこまで差は出ないかも知れんが
2012/03/23(金) 09:05:32.57
>>200

正規表現を並べただけだけど、Perl だとこんなかんじ。
http://ideone.com/BCiGc

とりあえず -u と -v のメタ表示以外サポート(もとの Haskell でも
サポートしてなかったので)。

2012/03/23(金) 12:57:34.26
ちなみに Snow Leopard の cat には -A -E -T が存在しなかった。
Lion 以降?
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構文で見えにくい状態移管が見えやすい形になった

2012/03/23(金) 14:00:00.76
とりあえず >>200 のバグ。

1. -v と -t の結果が同じになる。本物の cat は -v では TAB を変更しない。
2. 入力が改行で終わっていないときに、勝手に改行を追加してしまう。
3. -e をつけたときに、入力が改行で終わっていなくても最後に $ をつける。
2012/03/23(金) 14:18:13.40
>>204
いや、静的だろうが何だろうが、この半分の長さで書けるでしょ。
もともとの >>200 が、シンプルに書く気がないみたいだし。
2012/03/24(土) 00:35:00.64
>>204
> while gets do puts $_ end
これのことか?Perlじみた動きをするコードだね

getsは一行入力する
EOFならnil、入力があればそれを文字列型として
グローバル変数 $_ に突っ込むと共に、戻り値としても返す

Rubyの文字列型は必ず真であり、逆にnilは必ず偽なので
while gets は「EOFになるまで毎行を $_ として繰り返す」イディオムになる
あとはそれをputsで出力してるだけ
2012/03/24(土) 02:18:53.77
>>207
それ自体は分かるよ
スクリプトだからなんだろうけど、標準入力とファイル読み込みの区別が無くて戸惑う
どこでファイル読んでるの?って
2012/03/24(土) 03:35:25.94
昔はプログラム側でファイルを開いたりしないものだったので、
たんに伝統的なやり方とも言える。
2012/03/24(土) 13:41:01.22
>>208
? 標準入力とファイル読み込みの区別はむしろしっかりされてるコードだと思うけど…
ファイルからの読み込みならいきなりgetsなんて書かないよ
その場合はファイルを開いて、それに対してメソッド呼ぶのが基本
標準入力から読むからこそいきなりgetsを書く
まあ確かにgetsの読み先をファイルに繋ぎかえることも出来るし
逆に標準入力をIOオブジェクトとしてメソッド呼ぶとかも出来るけど
このコードではそんなことしてないっしょ?
2012/03/24(土) 13:43:10.83
ああ、ごめんそゆことか
標準入力じゃなくてARGFからの読み込みの話だったね

ええとgetsは既定ではARGFから読む
んで、その内容はファイルを渡していないなら標準入力、渡されればそのファイルを全て繋いだものになる
2012/03/24(土) 13:45:09.34
多分Perlの<>辺りがARGFの由来だろうなあ
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に変えれば同じになるけど、どっちが正しい挙動なんだろ)
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
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

2012/03/24(土) 18:31:27.36
>>213-215
率直に言う

 関数型言語が使える使えないうんぬんの前に、常識的な(日本語の)文章表現を使えるようになれ

単にコードをコピペしただけで、自分の意図が相手に通じると考えるな
まともなヤシなら以下のような推論を自然に行って、それを文章で表現できる

・.... を期待して ..... という条件で (* 仮説1 *)
・..... というコードを試したが.....となり、期待にそぐわなかった -- (* 実験1 *)
・おそらく ..... が原因ではないかと思う (* 帰納1 *)
・そこで、新たに .... を期待して ..... という条件で (* 仮説2 *)
・..... というコードを試したところ .....となり、期待どおりの結果を得た -- (* 実験2 *)

ここまで言って分からなければ、お前さんは重症の「ハスケラ症」患者であり、
本人には自覚できない深刻なコミュニケーション不全の状態にある
とっとと隔離病棟(=Haskell本スレ)に戻ってオナニーでもしてるのがお似合い
2012/03/24(土) 19:37:53.91
このスレが隔離病棟だという認識がない、ってあたりが重症だなw
2012/03/27(火) 06:31:27.90
型は制約 #プログラミング初心者のミス


Zermeloを初心者呼ばわり、ワロスw
2012/03/27(火) 08:06:51.40
型付集合論自体がラッセルの逆説を回避するための制約ですし.
2012/03/27(火) 10:42:27.74
disることでしかアイデンティティを保てない可哀相な奴なんだよ。
2012/03/27(火) 10:47:08.52
オブジェクト指向 #プログラミング初心者のミス ←これとか
2012/03/27(火) 20:07:43.04
いやオブジェクト指向は糞
2012/03/28(水) 15:50:23.80
そうそうクラスとかインスタンスとかメソッドとかの用語を使う言語は100%糞!
2012/03/28(水) 17:07:26.99
いまどきは、組み込みみたいなリソースの厳しい案件でも使うけどな。
2012/03/28(水) 17:35:45.66
オブジェクト指向言語は使わなくても、設計では使うだろ
2012/03/28(水) 21:01:50.69
制御系やっているけど、OSはRedHatなのに、言語はCとアセンブラだ。
2012/04/01(日) 18:56:13.23
俺はよく知らんのだが、関数言語アンチとんの連中なの?
twitterやブログでも写真でもいいから見せてくれないか?
2012/04/01(日) 18:56:55.71
オブジェクト指向とは別名スパゲティ指向だと言われてる。
2012/04/01(日) 19:07:51.16
ねーよ

オブジェクト指向でスパゲティにするような奴は、ループ構文使おうが、例外を使おうが
スパゲティを作るんだよ。馬鹿は何を使っても同じ。
2012/04/01(日) 19:34:44.70
gotoやグローバル変数全盛時代、スパゲティコード生産しまくってた連中は
自分達がスパゲティ製造者だという自覚がなかったという

gotoでスパゲティにするような奴は、関数呼び出しを使おうが
スパゲティを作るんだよ、とか言ってね
2012/04/01(日) 21:02:29.24
お前ら立派なスパゲティ職人になれよ。
一芸に秀でりゃ食っていける。
2012/04/02(月) 05:53:15.86
関数型言語は別名ゴルフ指向言語と言われているなw
2012/04/02(月) 07:10:20.20
>>230
>gotoでスパゲティにするような奴は、関数呼び出しを使おうが
>スパゲティを作るんだよ、とか言ってね

いや、まさにその通りだろ。
2012/04/02(月) 07:20:22.37
スパゲティで塩やきそばを作ると結構いける
2012/04/02(月) 13:11:51.33
>>230
スパゲッティ・コードというのは、ウケ狙いの後付表現に過ぎないからな。

gotoを使ったからスパゲッティになった、なんていう理屈だと、
あと10年くらいして改善された手法が一般的になったら、
今コード書いてる連中は殆どスパゲッティメーカーになってしまう。
2012/04/02(月) 19:28:12.79
スゲパティシエ
2012/04/02(月) 20:05:39.34
>>235
いや、だから関数型言語使ってる連中がOOP使ってる連中に
「お前等スパゲティコード書いてるぜ」って言ってるんだろ?
2012/04/03(火) 12:58:40.32
スパゲティコードは読み辛く、読み解ける人は限られていた
一方、関数型言語のコードはそもそも読める人が限られていた

広まるといいですね関数型言語
2012/04/03(火) 13:30:15.51
関数型だって普通にスパゲッティになるしw
2012/04/05(木) 12:51:22.26
haskellのdo内はなぁ。。。 関数型スパゲティの宝庫だね。
ナポリタンにしますか?ミートソースにしますか?それとも、カルボナーラにします?
2012/04/05(木) 20:19:43.36
何故Haskellのdo内でスパゲティになるか
理由を>>240は説明できないだろう
2012/04/05(木) 21:01:04.36
関数型言語に馴染まないものを無理に突っ込んだ悪足掻きだからさ
生まれ付いての汚れ役だね
2012/04/05(木) 21:07:23.34
doはただの関数合成の構文糖なんだが
関数の合成が関数型言語に馴染まないとは面白いことを言うなぁ

まあ、>>242はdo構文を普通の関数合成の表記に
書き直す事すらできないだろうけど
2012/04/05(木) 21:14:39.14
流石は関数型言語ユーザー様
上から目線が板に付いてますねw
2012/04/05(木) 21:35:11.51
永遠に学習しない態度が板に付いている奴はほんとカスだな
2012/04/05(木) 21:43:45.64
>理由を>>240は説明できないだろう
>書き直す事すらできないだろうけど
>永遠に学習しない態度が

決め付けも大好きみたいすねw
2012/04/07(土) 01:09:28.66
構文糖衣が必要なのは相性が悪いからじゃないの?
2012/04/07(土) 01:20:29.83
良く使うから構文糖が用意されるって話は分かるが
相性が悪いから?なにそれ?

じゃあ何か。C言語で x=x+1 を x++ と書けたり
*(x+1) を x[1] と書ける構文糖が用意されてるのは、
C言語がインクリメントや配列と相性悪いからか?
2012/04/07(土) 05:35:33.68
>>248
> じゃあ何か。C言語で x=x+1 を x++ と書けたり

その2つが同じセマンティクスだと思っているのなら
もう二度とコードを書かないほうがいいぞw
2012/04/07(土) 06:01:26.63
x86ならおんなじじゃないの?
2012/04/07(土) 07:41:13.84
>>249
ああごめん。++xだったね
2012/04/09(月) 14:07:02.39
>>251
大分近くなったが、まだセマンティクスは完全に一致してないのだが…
マジでプログラマやめたら?
2012/04/09(月) 20:12:07.88
xが整数かポインタかで細かいところは変わるし、そこまでこだわる理由も無いように思うがw
2012/04/10(火) 06:27:34.64
Cリファレンスマニュアル5th edition読む限りでは ++x と x+=1 と x=x+1 は
等しいと読めるし、今手元に無いから記憶だけど規格書でもそうだった気がするが...
xが整数かポインタかで変わる?ありえんだろ
2012/04/10(火) 06:53:56.48
整数ならインクリメント命令にできるが、ポインタだとそうはいかない。

>>249 は x=x+1 において x の評価が 2 回起きる、と言いたいらしいが、
ここでは x は任意の式ではなくて、ただの変数なので、その違いは無い。

結論。>>249 は今すぐプログラマをやめて、一生 2 ちゃんねるもプログラムも書くな。
2012/04/10(火) 06:55:53.83
>>255
ポインタでもできるよ?何言ってんの?
2012/04/10(火) 07:23:12.98
そりゃ 4 増える「インクリメント命令」がありゃ、int を指してるポインタでもできるが。
2012/04/10(火) 07:50:03.25
ん?今は x=x+1と++xの違いの話だろ?
どっちもxがポインタなら sizeof(*x) だけ増加する
2012/04/10(火) 08:51:18.39
>>255
> ここでは x は任意の式ではなくて、ただの変数なので、
なにか鬼畜なマクロかもしれませんよ。小文字一字なマクロは私の好みではありませんが。
2012/04/10(火) 11:46:04.65
仮に (1+1) に展開されたら ++ なんてできない。以上
2012/04/10(火) 12:12:40.99
>>255
ねえ、君、本当にプログラマ?
プログラミングで給料取れるレベルじゃないよ。
2012/04/10(火) 12:14:47.94
>>259
マクロの引数だったりすると、小文字一文字はよくある話だなw
2012/04/10(火) 12:14:53.18
結局具体的には全く反論できないんだなw >>261
2012/04/10(火) 12:27:04.25
セマンティクスの話してるときに
字句レベルの置き換えであるCマクロ持ち出す馬鹿は
プログラマに向いてないから辞めた方が良い
まともに言語規格書読めないだろ

例えば
#define double int
とされてたら double x; でも x はdouble型とは言えない、
とか言い出すレベルでバカなわけで
2012/04/10(火) 13:07:24.91
セマンティクスとしては x の評価を 2 度する、というのは変わらんじゃないのかな。
その評価が状態に対して idempotent かどうかという違いであって。
2012/04/10(火) 19:21:01.18
>>249
その2つのセマンティクスの違いって何なの?
そろそろ答え教えてくだしあ
2012/04/11(水) 17:15:34.44
結論: 教えてクレクレ君は二度とコード書かないほうがいい馬鹿
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。