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

■ このスレッドは過去ログ倉庫に格納されています
2012/02/28(火) 20:45:47.95
前スレ
http://toro.2ch.net/test/read.cgi/tech/1320743217/
2012/08/21(火) 19:58:11.26
ズレてるよなw
407デフォルトの名無しさん
垢版 |
2012/10/21(日) 08:24:20.80
408デフォルトの名無しさん
垢版 |
2013/04/04(木) 12:53:10.94
軽量動的言語から来たけど
letとかのバインド?が何のために必要なのかわからない。
せっかく型推論で型記述しなくてすむのに意味なくない?
2013/04/04(木) 13:26:13.63
値の再利用と表現の簡潔化でしょ。
Don't Repeat Yourself的に。

letでも型の記述は(型推論できる式なら)いらないし。
2013/04/04(木) 13:38:08.65
何度も評価するより1度の評価で済むほうが速いだろw
2013/04/04(木) 23:30:06.56
一文字でも少なくタイプしたいなら ruby やってろ
っていう話じゃないの
412デフォルトの名無しさん
垢版 |
2013/04/05(金) 00:10:33.03
let無しだと構文解析のルールがとても複雑になるんだな〜
413デフォルトの名無しさん
垢版 |
2013/06/20(木) 19:42:10.61
関数型言語ってループは末尾再帰で書くんですよね?
それってループするために関数定義の為に名前を消費する必要があるってことですか?
その、べつにそれがいいとか悪いとか言うんじゃなくて、単純に気になっただけなんですけど。
2013/06/20(木) 20:25:36.29
たいていは通用範囲がローカルなかたちで名前をつけることができるから問題ない
2013/06/20(木) 21:24:23.61
>>413
>関数型言語ってループは末尾再帰で書くんですよね?

関数型言語の原理、というか計算モデルという視点であれば、その認識は正しい

>それってループするために関数定義の為に名前を消費する必要があるってことですか?

関数型言語では(数値や文字列と同様に)関数そのものも式の要素になる
言い換えると、関数の引数として関数を渡したり、関数の戻り値も関数として定義でき、
こういった関数の使い方は「高階関数」と呼ばれている

一般に関数型言語には、この高階関数を応用したライブラリが標準で付属しており、
このライブラリ関数を利用する事によって、多くのケースでは関数再帰を意識せず
(手続き型言語における)ループ処理をプログラミングできるし、無駄な名前の消費も無い

高階関数の代表例にはリスト処理を提供する List.map, List.filter, List.fold があり、
たとえば Ruby では以下に示すようにモジュール Enumerable のメソッドとして定義されている

・List.map -> Enumuerable#map
・List.filter -> Enumerble#select, Enumerable#reject
・List.fold -> Enumerble#inject
2013/06/20(木) 21:58:56.06
ある集合の各要素へ、ある関数を適用した場合の、新たな集合を知るのがループの目的であるならば、
最初の集合と適用する関数を記述するだけで結果の集合を得られるので、他の言語のように何をするにもforループを書く的な書き方はあまりしない。
417415
垢版 |
2013/06/20(木) 22:09:07.44
>>415では肝心な事を書き忘れていたので追記する

>>413も知っているように関数には名前を付けることができて、
これは「関数を定義する」と呼ばれることが多い
同時に、関数型言語には「無名関数」と呼ばれる概念があり、
「ラムダ式」あるいは「関数式」とも呼ばれる
つまり、(>>415で述べた)高階関数へ渡す関数や戻り値としての関数には
この無名関数を使えばいいから、無駄な名前を消費せずにプログラミングできることになる

たとえば Standard ML という関数型言語では、無名関数の文法は「fn <引数> => 式」であり、
その無名関数をリスト処理関数 map へ渡すサンプルコードは以下の様になる

 - map (fn x => x + 1) [1, 2, 3];
 > val it = [2, 3, 4] : int list

Ruby であれば、以下のように書く

 irb(main):001:0> [1, 2, 3].map { |x| x + 1 }
 => [2, 3, 4]
2013/06/21(金) 00:40:31.57
>>414-417
回答ありがとうございます。

>>417
自分も無名関数についてはある程度知っていました。
Cのqsort関数なんかを使う時に、lambdaで直接関数を渡せたらいいななんて思うこともあります。
まあ、Cをアセンブリ言語のマクロと考えれば、欲張らない仕様の方がいいんでしょうけど。

そんなことを考えている時に、無名関数という仕様を持っている関数型言語でさえ、結局のところ、
余計な名前を使わなきゃならない場面があるのかと疑問に思って質問させて頂きました。
# 自分は関数名を考える作業があまり好きではないので。

>>414さんや>>416さんの話で関数型言語を使う人の意識というか感覚みたいなものが多少判ったような気がします。
「そんなことを気にする場面ってあんまりないよ」ってことだと思うのですが、それは

> 一般に関数型言語には、この高階関数を応用したライブラリが標準で付属しており、
> このライブラリ関数を利用する事によって、多くのケースでは関数再帰を意識せず
> (手続き型言語における)ループ処理をプログラミングできるし、無駄な名前の消費も無い

ということだからってことですね。
いろんな観点でのコメントがもらえて勉強になりました。
ありがとうございました。
2013/06/21(金) 01:28:15.65
lambda だけで再帰はむりかと
2013/06/21(金) 04:09:08.96
でもYコンビネータなら?
2013/06/21(金) 10:44:44.88
(λf . (λx . f (x x)) (λx . f (x x)))
2013/06/21(金) 11:37:03.55
>>420
評価器による。正規なら記述可能。
2013/06/22(土) 17:48:31.52
>>422
> >>420
> 評価器による。正規なら記述可能。

CurryのYコンビネーター(そのλ式による表現は421にある通り)はどんな評価戦略でもリダクションだけでは進まない(逆向き、つまり一般のconversionが必要)。
しかし例えばTuringのΘコンビネーター(詳しくはBarendregtの百科事典を見ろ)ならば評価戦略がnormal orderの場合にはリダクションで再帰を表すことができる。
更にapplicative orderのリダクション戦略(かつλ束縛の本体にはリダクションが入らないweak戦略)という通常のcall-by-value関数的プログラミング言語の
評価戦略でも、λ束縛つまり高階関数によって再帰を表現する事は可能。FriedmanらのSeasoned Schemerに答えが書いてある。
つまり現実のSchemeを用いた関数的プログラミングで再帰呼び出しを完全に消しさることは実際に可能ってことだ。
2013/06/22(土) 20:12:46.50
>>423
「リダクションだけでは進まない」って何を指して言ってる?
y fを評価していってもf (y f)と構文的に同じにならないってこと?
再帰を記述するのが目的ならそれは別に必要ないんじゃね

import Unsafe.Coerce

main = print $ y (9:)

y :: (a -> a) -> a
y = \f -> (\x -> f (unsafeCoerce x x)) (\x -> f (unsafeCoerce x x))
2013/06/23(日) 18:49:02.67
>>424
> >>423
> 「リダクションだけでは進まない」って何を指して言ってる?
> y fを評価していってもf (y f)と構文的に同じにならないってこと?

(λx..M)N → Mの中の自由なxをNで置き換えた項

という一種の書き換えによって左から右へと進めるのがリダクション。
この左から右への向きだけではYfからスタートしてf(Yf)は得られないということ。

カリーのYでなくチューリングのΘを用いて最左最外のリデックスをリダクションする正規戦略ならば
Θfからスタートしてf(Θf)までリダクションだけで辿り着くことが可能。
2013/06/23(日) 19:48:23.59
>>425
再帰をするのが目的ならf (Y f)を得る必要はないよね
なんか適当な意味論のもとでY fがf (Y f)と同じになればいい
2013/08/28(水) NY:AN:NY.AN
プログラム言語における関数型言語っていうのは
OSにおけるLinuxみたいなものだと思っている

何年も前からユーザは「これからは関数型言語(Linux)の時代」と連呼しているのに
まったく流行しない。またユーザーは関数型言語(Linux)を使う事がカッコいいと信じているw
2013/08/28(水) NY:AN:NY.AN
Windows信者のバカ君が今度はココに沸いたw
2013/08/28(水) NY:AN:NY.AN
LinuxじゃなくてMacみたいな感じをうけるけどな
2013/08/29(木) NY:AN:NY.AN
今時Mac信者で、Mac OSとLinuxが、どちらもUnix系という同類であることを知らないなんて、
相当のバカだぞ?

……相当のバカなのかw
2013/08/29(木) NY:AN:NY.AN
おまえはなにをいっているんだ
2013/08/29(木) NY:AN:NY.AN
そんなわかりきったことをドヤ顔で講釈する>>430って…
433デフォルトの名無しさん
垢版 |
2013/09/02(月) 10:09:50.80
>>427
手段と目的を履き違える奴は
関数型言語には(Linuxもか)向いてない
2013/09/02(月) 14:43:34.87
で、流行でしかモノを判断できない奴の使っている言語はなんなんだ?
435デフォルトの名無しさん
垢版 |
2013/09/02(月) 15:56:05.57
サンデープログラマーだから
業界で関数型が流行ってるって事すらわからん
2013/09/02(月) 16:01:31.04
JavaScriptって関数型言語とも見れる???
2013/09/02(月) 16:10:50.92
>>436
そんなこと言い出したらCでも関数型プログラミングはできる
2013/09/02(月) 16:18:46.45
いや、そういうマクロ的屁理屈じゃなくて
ラムダ式とか第一級関数とか、前向きな機能揃ってるんじゃないかなあと思って
2013/09/02(月) 16:21:38.70
>>436
いまさら
2013/09/02(月) 16:21:53.27
関数型プログラミングならどの言語でもできる
関数型言語と呼ばれるのは関数型プログラミング「しか」できない言語だ
だから「使えない」と烙印を押される
JavaScriptはそうじゃないだろう?
2013/09/02(月) 16:23:20.07
また意味不明な論理が来ました。

Haskell以外に『関数型プログラミング「しか」できない言語』ってあるか?
2013/09/02(月) 16:24:26.89
>>441
屁理屈乙
お前は0か1かしか考えれんのか
2013/09/02(月) 16:38:50.97
度合いを日本語で語るとかプログラマの恥。
勘違いして欲しくないんなら数値で語れ。
2013/09/02(月) 16:40:41.13
言語を作った人が「これは関数型だ」と言い張れば関数型になる。
そうでないなら外野があれこれ言うのは野暮というものだろう。
2013/09/02(月) 17:00:37.50
関数型は使えないというタイトルなんだから、そんな結論じゃダメでしょ。
関数型だとアピールしてる言語はクソが多いってことなら問題ないけど。

……あ、もしかしてそういう話?
2013/09/02(月) 17:40:30.44
関数型言語の問題点は「汎用的すぎる」って点にあると思う

低レイヤ…C
ゲーム…C++
言語処理系…C++
統計…R
CGI…Perl
Webアプリ…PHP
ブラウザ…JavaScript
Windowsアプリ…C#
iPhone…Objective-C
汎用スクリプト…Python, Ruby
業務システム…Java

「この用途ならこの言語」って言えるような分野って関数型言語にある?
2013/09/02(月) 18:07:41.26
なんか書き込みが多いと思ったら、どうでもいい書き込みばかりだな
2013/09/02(月) 21:59:22.67
関数型言語でググレカス
2013/09/02(月) 22:05:32.41
関数型ってGUIもI/Oも苦手分野じゃん。
いったいどうしろってんだ。
2013/09/02(月) 22:23:05.16
苦手なの?
手続き型みたいにかけるけど
2013/09/03(火) 07:18:29.13
それはもはや関数型プログラミングではない
2013/09/03(火) 17:12:46.33
モナドを持て囃している時点で、関数プログラミングは負けを認めたようなものだな。

モナドはマルチパラダイムだ、などと言い訳しているようだが、
結局は関数プログラミング単独では実用プログラムは書けない。
関数だけでなく、逐次実行と状態書き換えを導入しなければ使い物にならない。
そう認めたようなものだ。
2013/09/03(火) 18:02:29.25
>>452
>関数だけでなく、逐次実行と状態書き換えを導入しなければ使い物にならない。
いくら抽象的に書こうが実行できなければ使い物にならない、
と言ってるぐらい当たり前の話すぎてどう反応したらいいか。
2013/09/03(火) 18:42:50.03
IO型があるのは、単にプリミティブ型とボックス型を厳密に区別してるのとたいして変わらないのに、
モナドモナドモナドー、って叫んじゃうのが初心者なんだよねw
2013/09/03(火) 18:44:40.59
>>452
その通りだよ
いわゆる「関数型言語」は、言語全体を見て初めて便利なのであって、
関数プログラミングはできることの一つでしかない
2013/09/04(水) 04:40:23.07
>>453
実行メカニズムと言語表現の区別ぐらいつくようになってから出直してくださいまし。
2013/09/04(水) 07:05:14.29
>>454
全然違う
2013/09/04(水) 23:24:13.96
>>456
どういう意味だよ。現実に書けるだろ。

レスそれ自体は要求した事を行わなければ、
要求を満たす事はできないっていう言葉遊びだ。
無理な前提を想定して適用してるのだから無理に決まってる。

プログラムの実行を考えない実用性を含むなら、
定理証明支援系という使い道もあるから間違い。
2013/09/05(木) 01:50:32.92
俺的には関数型とかどうでもいいけど副作用の制限は制御したい
2013/09/05(木) 01:59:36.31
結局関数プログラミングとかは方法であって目的ではない
これに尽きる
目的にすり替わってしまったら、そりゃダメだろ
2013/09/05(木) 02:10:37.52
とりあえずjavaつかって
関数型プログラミングしたいところだけラムダ式だのなんだの使ってそれっぽくやればそれでいいじゃん。
最初から関数型言語を使う意義なんて無いね。
2013/09/05(木) 05:03:35.90
>>458
わからないんならいいよ。プログラミング言語意味論でも勉強して出直してきなw
2013/09/05(木) 13:04:21.73
>>462
言葉で飾るだけ飾ってるが一つも中身を語ってないな。
こんな阿呆に構った俺が馬鹿だった。
2013/09/05(木) 16:45:39.95
自分のレベルが果てしなく下であることがわからない奴ってたまにいるよなw
2013/09/05(木) 17:12:08.22
なんだこりゃ単語の関連の重みで文章を作成し無意味なことを言っている人工無能みたいな奴がいるw
2013/09/05(木) 17:33:42.12
> 関数型プログラミングしたいところだけラムダ式だのなんだの使ってそれっぽくやればそれでいいじゃん。
> 最初から関数型言語を使う意義なんて無いね。

MLなりHaskellなり、現代において普通に「関数型言語」だと認められるものも全く知らないことが丸出しw
2013/09/06(金) 03:04:27.46
リストと高階関数を使うことを関数型プログラミングと思ってる奴は多いな
2013/09/06(金) 08:10:18.30
えっ?lリストって関数型にしか無いの?
配列は?タプルは?ストリームは?
2013/09/06(金) 09:45:16.04
批判はしても具体的な主張はしない。
それが2ちゃんねらー
2013/09/06(金) 09:53:28.43
具体的に主張したら論破されちゃうからな
批判だけしていれば致命的に論破される可能性は低くなる
471デフォルトの名無しさん
垢版 |
2013/09/06(金) 12:04:47.07
例えるなら文系(命令型)社長が
理系(関数型)社員を使いこなせてない状況に似てる

理系社長だと
理系社員で固めるから
そもそも使えないと言う評価が存在しなくなるしな
472デフォルトの名無しさん
垢版 |
2013/09/06(金) 12:57:55.41
命令型が好きな奴は
仕様書の命令に従うのもお手の物

俺は命令するのもされるのも嫌いだ
2013/09/06(金) 13:15:25.15
2ちゃんねら(レス) : 批判
=> ...
2013/09/06(金) 13:19:40.75
所属 = function
 | 批判 -> 2ちゃんねら
 | _ -> 一般
2013/09/06(金) 17:48:37.59
文系理系って馬鹿だろw
2013/09/06(金) 19:43:09.98
この世は文系理系じゃなく体育会系とその他で分かれてるからな
2013/09/07(土) 05:40:06.35
このスレの流れでは
非関数型=手続き型=命令型=体育会系型
ってことかね。
2013/09/07(土) 06:48:28.75
そう思ってる関数型の人は多いよね。
2013/09/12(木) 16:20:46.29
文系と理系というより自民と民主だな
関数型言語は20年くらい前の民主

現政権の手続き(命令)型言語には嫌なところがたくさんあるが実稼働してるという実績があり
なにより関数型言語のいいところを貪欲に取り入れるという動きもあり好印象
関数型言語はお花畑気分が抜けずチャンス与えるのすら怖い
って感じ

むしろ共産党か
480デフォルトの名無しさん
垢版 |
2013/09/12(木) 16:27:15.89
出発点のLISPは共産主義者が作ったしな
481デフォルトの名無しさん
垢版 |
2013/09/12(木) 16:28:16.68
手続き型はそのうち取り返しのつかない事をやってしまう
原発は安全です(キリッみたいなw
2013/09/12(木) 16:54:54.84
それに比べて関数型は核融合炉のように安全
2013/09/13(金) 18:12:18.29
>>435
javaやPHPなんて仕事があるから選ぶだけで、日曜プログラマこそ関数型言語を使うべきだよ
484デフォルトの名無しさん
垢版 |
2013/09/13(金) 18:51:54.73
>>483
だよな
何が楽しくてjavaやるのかわからん
マゾかな?
2013/09/13(金) 19:04:33.60
>>483-484
どの言語でどんなソフトウェアを作ってるのかも知らずに関数型を押し付けてる時点で
お前らが厨二病患ってるだけの素人だってわかるよ
2013/09/13(金) 19:09:08.90
素人とかそりゃそうだろw
サンデープログラマーなんだから
流石、手続き型は論理的でない馬鹿な事を言う
2013/09/13(金) 19:11:44.12
えっ
2013/09/13(金) 19:25:45.86
Javaは関数型言語だろ
ラムダ式あるし
489デフォルトの名無しさん
垢版 |
2013/09/13(金) 19:34:57.88
ググったらマジだったw
javaも関数型の軍門に下ったか
2013/09/13(金) 20:14:10.24
リリースもされてないものを何言ってるんだ
2013/09/13(金) 20:44:05.01
Javaのはラムダと言ってもかなり制限されてるからな
2013/09/13(金) 22:43:53.45
>>491
ラムダありゃいいってもんじゃねーだろw
2013/09/14(土) 01:06:39.03
>>488
素の状態では変数の書き換えが出来ないのが関数型言語だと思うの
ごにょごにょすれば、関数型言語でも書き換えが出来るけど、手続き型よりは手軽じゃないって意味で
2013/09/14(土) 06:58:59.93
お前ら向きの最強言語教えてやるよ。Dだ。
2013/09/14(土) 08:01:42.47
「その辺の言語のよさそうな機能をぜんぶ集めてみました」みたいな言語って
美意識のカケラもないと思うの。
2013/09/14(土) 09:26:02.00
>>495
なんでそこだけオカマ口調なんだ
2013/09/14(土) 21:07:22.00
フフフ、いいわね、子どもって
あたしにもそんな純粋な頃があったわ
2013/09/15(日) 11:31:04.95
グフフ、いいわね、子どもって
499デフォルトの名無しさん
垢版 |
2013/10/25(金) 17:49:17.08
生産性100倍スレがブレイクしてんな
こっちも盛り上げようぜwww
500499
垢版 |
2013/10/25(金) 17:50:06.58
>>498>>499
この間に1スレ消化してるからなあっち
2013/10/25(金) 18:42:45.06
煽り力が足りない
502デフォルトの名無しさん
垢版 |
2013/10/26(土) 17:05:44.89
age
503デフォルトの名無しさん
垢版 |
2013/10/26(土) 20:34:14.04
生産性100倍スレはpart1が
2013年の3月に立って756まで一気に消化。そこそこのヒットスレではあった。

そこから伸びが鈍化してたが
10月になって837からまた急に伸びだしそのまま1000。
そして勢いはとどまらずpart2をまるまる消化。
いまいちきっかけがよくわからん
暇があったらまとめてみるか
504デフォルトの名無しさん
垢版 |
2013/10/26(土) 20:35:04.98
対となるこのスレももっと盛り上げないとバランスとれない
505デフォルトの名無しさん
垢版 |
2013/10/26(土) 20:55:20.40
俺、いつも上げるだろ、
そこから顔真っ赤にした戦いが始まるんだよ。
戦いはいらないから、俺の書き込みにレスしろって話。
何勝手に戦っちゃってんの。
あと、夜中に盛り上がるのやめてくれる?
勝手に盛り上がるなら次の日まで続けろよな。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況