09/03/07 20:28:23
ああ、すまん。Javaの方のListを作りたかったわけね。それなら、Listでぐぐっても
出てこないわ(それだと、ScalaのListが出てくるし)。調べるべきは、Listの作り方じゃなくて、
ScalaでのGenericsの使い方の方だったね。Scala Genericsでぐぐれば、色々出てくる。
var list = new ArrayList[File]
772:デフォルトの名無しさん
09/03/08 11:33:00
コレクションは特別な理由がない限りScalaライブラリのを使ったほうがいいとおもうけどなあ。
773:デフォルトの名無しさん
09/03/27 16:32:46
関数型言語について勉強中の者です。
関数型言語らしいプログラムの書き方ってどういうのを言うんでしょうか?
「リスト」を最初に作り、それに関数を適用して行くという形式で行くのが大事そうだ、というのは解りました。
ただ、これを読んでかえって解らなくなってしまいました。
刺激を求める技術者に捧げるScala講座---目次:ITpro
第7回 関数脳のつくり方 First Season
URLリンク(itpro.nikkeibp.co.jp)
これを書いている人はなんか理解したようなのですが、読んでもちっとも解りません。
特に
URLリンク(itpro.nikkeibp.co.jp)
>しかし,オブジェクトの技術を使わず,純粋に手続きで考えてみたのですが,頭がパニックになりそうでした。
>最初のNode(XMLタグ)を取得して,その子要素をとってループをまわす。
>その子要素がDirの場合は,childでさらにその子要素をとってループを回す。
>Fileの場合は中身のファイル名を表示する。Dirの子要素にまたDirが含まれていたら,さらにchildを適用して…。
このあたり。
手続きだって再帰すればすぐだと思うのですが。
手続きって言った場合、再帰は含まないのでしょうか?
774:デフォルトの名無しさん
09/03/27 17:09:12
駄文読まずに>>8のチュートリアル翻訳版読めば?
775:デフォルトの名無しさん
09/03/27 20:05:13
>>773
その文章、体裁はともかく内容としては
人に何かを説明することを目的として書かれたという感じがしない。
自分の頭を自分なりに整理してみただけの感想文という感じ。
776:デフォルトの名無しさん
09/03/27 21:23:46
ScalaってJavaで作られた過去の遺産をそのまま使えるという点では素晴らしいけどさ
Scala使うなら関数型の技法を習得必要があるじゃん
だってScalaでJavaの書き方使うってんなら、Scala使う意味がないんだもん
大変残念だけど日本のほとんどのシステム開発の現場では採用されないだろうね
先鋭的な技術会社なら別だけど
777:デフォルトの名無しさん
09/03/27 21:25:52
>>776
> Scala使うなら関数型の技法を習得必要があるじゃん
scalaを学べば十分
778:デフォルトの名無しさん
09/03/27 21:45:34
だからScalaを習得するってことは関数型言語を習得するってことと同義だろ?
Scala使って関数型言語のメリットを利用しないってのは意味がない
Javaだけ使ってればいいんだから
学習コスト高すぎってことだ
779:デフォルトの名無しさん
09/03/27 22:01:50
リストを使うっていうよりは一般的に副作用を最小化する心がけを持つといいんじゃないかな。
そして副作用のないコレクションの代表選手がリストなのでリストはよくつかわれる。
その記事で何を手続き的として想定してるかはわかんないけど、同じ再帰を使うのでも、
たとえばツリー構造からある条件で抽出するときに、
「結果を格納する変更可能なコレクションを用意しておいて再帰しながらその入れ物に追加していく」だとかなり手続き的だけど、
「再帰呼び出ししながら戻り値であるリストの和集合をとっていく」だとちょっと関数的になる、みたいな。
780:デフォルトの名無しさん
09/03/27 22:02:30
scalaって関数型にしては癖が強いと思うよ。それはjavaを使った人向けに作られた
関数型言語でもあるからだよ。
日本で採用されるかどうかってのは、海外で普及して権威付けされるかどうかでしょ。
右に習えしか出来ないんだからね。先陣を切ってやるような多少?のリスクを背負っ
て進めるようなところはないだろうから。まだ、ベンチャーが育つ土壌があるならば、
可能性はあると思うが、海外で普及したあとの2、3年まちってところではないかな。
並列プログラミングが重要さを増せば変わってくると思う。
学習コストは手続き型しか知らないような人にとってみれば未知への恐怖というコスト
が高いと思うが、基本的なところは然程難しくないと思うよ。この手の事で保守的な
ことを言って無理だと言う人って、一般的に融通が利かない人の傾向があるよ。そんな
人が多いんかなぁ。プログラマってひとたちは。。。
781:デフォルトの名無しさん
09/03/27 22:03:39
javaプログラマ向けの関数型言語になってるから学習コストはさほど高くないと思うんだが。
782:デフォルトの名無しさん
09/03/27 22:06:29
>>778
全然そうは思わない。ScalaはScala、関数型言語ではない。
783:デフォルトの名無しさん
09/03/27 22:13:56
>>780
>>782
Scalaと関数型言語の特性については無知だったようですまねぇ
でもね、俺みたいな2次請け3次請けで働いてるプログラマってプログラマの多数派なわけじゃん
そんな多数派の「現場」ではRubyすら使われる気配がないし、ましてや関数型言語なんて採用されるわけがない
ってことを言いたかっただけなんだが
784:デフォルトの名無しさん
09/03/27 22:29:12
>>783
ごめん。言いすぎた。
言うようになかなか採用されないと思ってるよ。
785:デフォルトの名無しさん
09/03/27 22:35:34
Scalaは関数型言語ではなくて、
関数型言語の機能、特徴[も]兼ね備えている言語。
今では特に珍しいことではない。
URLリンク(www.scala-lang.org)
Introducing Scala
> It smoothly integrates features of object-oriented and functional
languages
URLリンク(www.scala-lang.org)
Learning Scala
> If you come to Scala with a functional programming background
> you will find most of the more advanced functional programming
style familiar.
URLリンク(www.scala-lang.org)
Book "Programming Scala"
> "Programming Scala" will show you the fundamentals of functional programming using Scala.
786:デフォルトの名無しさん
09/03/27 22:41:01
ちょっと件のページのデータを踏襲した例を作ってみた。
まずこれは再帰を使ってるけど手続きっぽいでしょ。resultが順次更新されていくから。
import scala.xml._
import scala.collection.mutable._
val result = new ArrayBuffer[Node]
def find1(node: Node)(pred: Node => Boolean): Unit = {
if (pred(node)) result += node
for (child <- node.child) find1(child)(pred)
}
find1(xml) { case <file>{_*}</file> => true; case _ => false }
こうするとちょっと関数型っぽくなる。
def find2(node: Node)(pred: Node => Boolean): List[Node] = {
if (pred(node)) List(node)
else node.child.toList.map(find2(_)(pred)).flatten[Node]
}
val result = find2(xml) { case <file>{_*}</file> => true; case _ => false }
find2は便利メソッドのflatMapを使ってこう書いても同じ。
def find3(node: Node)(pred: Node => Boolean): List[Node] = {
if (pred(node)) List(node)
else node.child.toList.flatMap(find3(_)(pred))
}
787:デフォルトの名無しさん
09/03/27 22:50:18
>>773
関数型言語の勉強なら「プログラミングの基礎」がいいよ。
URLリンク(www.amazon.co.jp)
788:デフォルトの名無しさん
09/03/27 23:01:52
Scalaは関数型の要素抜きのGood Javaで使っても結構いい線いけてるから、
なかなか関数型まで行き着かないんだよね。
同じJavaVMで動くといってもJavaと食い合う言語だなと思ったよ。
確かに関数型だけを学びたいならHaskellやML系の言語を先にやったほうが手っ取り早いかもしれない。
789:デフォルトの名無しさん
09/03/27 23:10:13
OCaml亜種のF#がC#や他の.NETグループの言語と組み合わせる前提の
設計になってるのと対比すると特徴的だな。
790:デフォルトの名無しさん
09/03/28 09:22:03
URLリンク(jp.techcrunch.com)
コンパイルしたScalaもつかえそう。
791:デフォルトの名無しさん
09/03/28 09:40:47
いや、当然APIが制限されてるって。
Python版がそうであるように。