【アンチ】関数型言語は使えない【玩具】 2at TECH
【アンチ】関数型言語は使えない【玩具】 2 - 暇つぶし2ch413:デフォルトの名無しさん
13/06/20 19:42:10.61
関数型言語ってループは末尾再帰で書くんですよね?
それってループするために関数定義の為に名前を消費する必要があるってことですか?
その、べつにそれがいいとか悪いとか言うんじゃなくて、単純に気になっただけなんですけど。

414:デフォルトの名無しさん
13/06/20 20:25:36.29
たいていは通用範囲がローカルなかたちで名前をつけることができるから問題ない

415:デフォルトの名無しさん
13/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

416:デフォルトの名無しさん
13/06/20 21:58:56.06
ある集合の各要素へ、ある関数を適用した場合の、新たな集合を知るのがループの目的であるならば、
最初の集合と適用する関数を記述するだけで結果の集合を得られるので、他の言語のように何をするにもforループを書く的な書き方はあまりしない。

417:415
13/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]

418:デフォルトの名無しさん
13/06/21 00:40:31.57
>>414-417
回答ありがとうございます。

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

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

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

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

ということだからってことですね。
いろんな観点でのコメントがもらえて勉強になりました。
ありがとうございました。

419:デフォルトの名無しさん
13/06/21 01:28:15.65
lambda だけで再帰はむりかと


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch