プログラミング言語 Scala 2冊目at TECH
プログラミング言語 Scala 2冊目 - 暇つぶし2ch1:デフォルトの名無しさん
09/06/30 00:36:11
The Scala Programming Language
URLリンク(www.scala-lang.org)

リンク集
URLリンク(sites.google.com)

前スレ
プログラミング言語 Scala
スレリンク(tech板)

2:デフォルトの名無しさん
09/06/30 01:05:50
・Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
URLリンク(www.scala-lang.org)

・Scalaに関する書籍(英語)
URLリンク(www.scala-lang.org)
リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。

3:デフォルトの名無しさん
09/06/30 01:24:21
乙。
前スレなんで落ちたの?

4:デフォルトの名無しさん
09/06/30 01:33:08
>3
少数派のScala民は迫害されているのです。

5:デフォルトの名無しさん
09/06/30 01:36:11
980超えると24時間ぐらいでdat落ちだったかと

6:デフォルトの名無しさん
09/06/30 01:46:04
実行可能な機械語の列を書く手法が
だんだんと縮約されてきてるな
いい傾向だ

7:デフォルトの名無しさん
09/06/30 02:13:14
乙。

8:デフォルトの名無しさん
09/06/30 23:17:00
>>1

9:デフォルトの名無しさん
09/07/01 08:31:13
乙cala

10:デフォルトの名無しさん
09/07/01 20:14:49
>>1


11:デフォルトの名無しさん
09/07/02 22:56:45
>>1


12:デフォルトの名無しさん
09/07/02 23:24:33
話題無さ過ぎだな、このスレ。

13:デフォルトの名無しさん
09/07/02 23:54:43
質問でもニュースでも話題振ってくれさえすれば自分は反応するし、ほかにもそういう
住人は結構居るのではないかと。まあ、言うだけだとアレなので話題振ってみるか

Scala 2.8でコレクションライブラリが全面的に書き直されるけど、どう思う?
URLリンク(www.scala-lang.org)
再利用性っていう点ではよく考えられてるなーと感心するんだけど、初学者に対する敷居が高くなりそうな気が
してちょっと心配。たとえば、mapメソッドのシグネチャが
def map [B, That](f : (A) => B)(implicit bf : BuilderFactory[B, That, This]) : That
になってるけど、返り値がThatって何だよとか、ぱっと見で何が返ってくるかよくわからんようになってるのが
どうなんだろうと。

14:デフォルトの名無しさん
09/07/03 00:01:08
>13
お尻に付いてるimplicit ...は読み飛ばす癖がついてるので……。

せっかくだから、今までの奴との使い方の違いを解説してくれ。

15:デフォルトの名無しさん
09/07/03 01:19:43
>>14
うい。じゃあ、せっかくなので解説してみる。
2.8のコレクションライブラリの面白い点の一つは、高階関数が引数の関数の型+レシーバの型によって返り値の静的な型が異なる事を
許容している点。これだけだとさっぱりだと思うので例を挙げて説明してみる。まず、Map[String, String]のインスタンスを作る。
scala> val m = Map("x" -> 10, "y" -> 20)
m: scala.collection.immutable.Map[java.lang.String,Int] = Map(x -> 10, y -> 20)
でもって、mapメソッドを使って、Mapの全valueに10足してみる。
scala> m.map{ case (k, v) => (k, v + 10) }
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(x -> 20, y -> 30)
mapした結果がMapになっている点に注目。次に、mapの中でkeyを捨ててみる。
scala> m.map { case (k, v) => v }
res1: scala.collection.immutable.Iterable[Int] = List(10, 20)
すると、mapした結果の型がIterableに変わる。

文字列を使った例。まず、filterしてみる。
scala> "Hello, World".filter{c => c != 'l'}
res7: scala.runtime.RichString = Heo, Word
結果がRichStringになっている(2.7.XだとSeq[Char]が返ってきた)。文字列にmapしてみても、
scala> "Hello, World".map{c => (c + 1).toChar}
res8: scala.runtime.RichString = Ifmmp-!Xpsme
無名関数の返り値の型がCharならRichStringが返ってくるが、そうでなければ
scala> "Hello, World".map{c => (c + 1)}
res9: scala.collection.immutable.Vector[Int] = Vector(73, 102, 109, 109, 112, 45
, 33, 88, 112, 115, 109, 101)
Vector(2.8で新規導入された型)が返ってくる。こんな感じで、レシーバと引数に応じて適切な型の返り値を返してくれるように
なってるわけだ。まとめると、2.7.Xだと必要以上に一般的な型(SeqとかIterableとか)が返ってきてたケースの多くで、ちゃんと
要求にあった特殊化された型(MapだとかStringだとかSetだとか)が返ってくるようになってる。長文ですまん。

16:デフォルトの名無しさん
09/07/03 02:10:58
>15
んー、なんか分かったような気もする。

ソース見ると、
def flatMap[B, That](f: A => Traversable[B])(implicit bf: BuilderFactory[B, That, This]): That = {
val b = bf(thisCollection)
for (x <- this) b ++= f(x)
b.result
}
となってるから、BuilderFactory#applyの返値(最初の例だとMapBuilder)に
+=で要素を足していって最後に変換して返してるんだな。

コンソールで試してみるか、ソースを丁寧に追えば一応分からん事もないけど、
APIドキュメント見た時に、返ってくる型が分かりにくすぎないか? これ。

17:デフォルトの名無しさん
09/07/03 20:18:10
>>16
>APIドキュメント見た時に、返ってくる型が分かりにくすぎないか? これ。
そうそう。まさにそこが懸念。mapだとAPIドキュメント見ただけだと、ThatというGenericな型が返ってくることしかわからん。
implicit parameterの仕様をちゃんと把握してないと返り値の型もわからないというのはどうなんだろうなあ。

18:デフォルトの名無しさん
09/07/03 22:15:39
つーかこれ、APIドキュメントのどこをどういう順番で見たら、
「ああ、この場合のThatは、Map[String, Int]のことね」と得心出来るわけ?

19:デフォルトの名無しさん
09/07/03 23:19:17
Prologの99問から翻訳した問題集が上陸しているようです。
URLリンク(www.google.co.jp)

20:デフォルトの名無しさん
09/07/04 04:14:17
>>18
implicit parameterに適合するobjectを見つけるために、implicit parameterに関連付けられた(associated)クラスの
companion objectを探索しに行くというルールがある。関連付けられたクラスというのは、詳細はScala言語仕様の
7.2 implicit parametersを参照して欲しいんだけど、たとえば、

implicit bf :BuilderFactory[(String, Int), That, Map](Thatは不明な型)

の場合(これは、(String, Int)を返す無名関数が渡された場合になる)、BuilderFactory、Tuple2、Map、それらのスーパークラス、が関連付けられた
クラスになる。で、Mapのcompanion objectを見てみると、

implicit def builderFactory[A, B] : BuilderFactory[(A, B), Map[A, B], Map]

となっており、A = String, B = Intとすると、bfに適合する型になるため、これが選択される。その結果、
That = Map[A, B] = Map[String, Int]となり、これが返り値の型になる。一方、

implicit bf :BuilderFactory[Int, That, Map](Thatは不明な型)

の場合(Intを返す無名関数の場合)、Mapのcompanion object内のimplicit defにはマッチせず、そのスーパークラスであるIterableの
companion object内のimplicit def

implicit def builderFactory [A] : BuilderFactory[A, Iterable[A], Iterable]

にマッチして(A = Int)、返り値の型That = Iterable[A] = Iterable[Int]になる。まあ、これでわかると思うけど、なかなかにややこしい。
APIドキュメントにThatがどういう風に選ばれるのかちゃんと書かれてないと、APIドキュメントだけから読み解くのは結構きついもの
があると思う。

21:デフォルトの名無しさん
09/07/04 08:01:31
Scala Reference Manuals [ URLリンク(www.scala-lang.org) ] のページに
新機能の提案書兼概要みたいなのが用意されてたー
・ Scala Improvement Documents [ URLリンク(www.scala-lang.org) ]
2.8以降の追加機能みたい。

1. Named and Default Arguments (draft)
2. Scala Compiler Phase and Plug-In Initialization for Scala 2.8 (active)
3. New Collection Classes (draft)
4. Early Member Definitions (draft)
5. Internals of Scala Annotations (draft)


22:デフォルトの名無しさん
09/07/04 16:55:37
>>15 の m.map{ case (K, v) => (k, v + 10) } って、なんでcaseがついてるんだっけ?

あと、タプルを返す関数を渡すとMapが返ってるけど、
型パラメータを明示すればタプルのIterableを返すようにもできるのかな


23:デフォルトの名無しさん
09/07/04 17:30:01
>>22
Scalaでは複数引数の関数とタプルを受け取る関数が区別されてて、タプルを受け取る関数をcase使わないで
書くことももちろんできるんだけど、m.map{t => (t._1, t._2 + 10)}みたいになってキモイので、case使って書いている。

24:デフォルトの名無しさん
09/07/04 17:37:49
>>22
>型パラメータを明示すればタプルのIterableを返すようにもできるのかな
これはもちろんYES。

scala> m.map[(String, Int),Iterable[(String, Int)]]{case (k, v) => (k, v + 10)}
res0: Iterable[(String, Int)] = Map(x -> 20, y -> 30)

25:デフォルトの名無しさん
09/07/04 17:42:45
OCamlからScalaってわかりやすい?

26:デフォルトの名無しさん
09/07/04 17:45:55
2.8で継続入れるってどこかで読んだんだけど

27:デフォルトの名無しさん
09/07/04 18:49:02
これだった
A Taste of 2.8: Continuations
URLリンク(www.scala-lang.org)

28:デフォルトの名無しさん
09/07/04 19:25:28
新しいコレクションライブラリも相変わらず、再帰なんて糞食らえってな感じで
ループ使った実装ばかりだな。

29:デフォルトの名無しさん
09/07/04 21:33:10
>>20
mapメソッドの問題のひとつは、どのようなBuilderFactoryが用意されているかがわからないこと、という理解でいいのかね?

BとThisの組み合わせでBuilderFactoryが決定されるけど、用意されているものを知ってないとどのようなBuilderFactoryが使用されるかがわからず、よってThatがどの型になるかが予測できない。

これって、インターフェースが実装?(どのようなBuildFactoryがあるか)に依存してしまってると言えない?
最悪、Mapなどに用意されているBuildFactoryの種類に追加があると挙動が変わってしまう場合もある、ということになる。


30:デフォルトの名無しさん
09/07/05 02:16:02
>>28

Scalaさんて、末尾再起最適しなかったっけ?

31:デフォルトの名無しさん
09/07/06 04:44:18
>>29
>BとThisの組み合わせでBuilderFactoryが決定されるけど、用意されているものを知ってないとどのようなBuilderFactoryが使用されるかがわからず、
>よってThatがどの型になるかが予測できない。

ここはその通りだけど、

>これって、インターフェースが実装?(どのようなBuildFactoryがあるか)に依存してしまってると言えない?

これはちょっと違う。implicit parameterをうまく使うことによって、型パラメータが適切に推論されるので、型パラメータを書くのを
さぼれますよってだけのことで、型という観点からは、単にBuilderFactoryを余分な引数として取る普通のメソッドに過ぎ無い
わけで、別に実装に依存するとかそういう大げさな話ではない。

32:デフォルトの名無しさん
09/07/08 21:41:04
Groovyの作者(今は関わってないかも)James Strachanがこんな事書いてるね。
URLリンク(macstrac.blogspot.com)
注目すべきは、
"I can honestly say if someone had shown me the Programming Scala book by by Martin Odersky,
Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy."
2003年にProgramming Scala(たぶん、Programmin in Scalaの間違い)を読んでたら、Groovyなんて
作って無かっただろう、って。

個人的にはGroovyとScalaは適用領域がやや違う気がしてたので、Groovy作者からこういう言葉が
出てくるのは結構意外。

33:デフォルトの名無しさん
09/07/08 23:32:13
>32
それ使ってGroovyスレを荒らして来いって指令ですか?

34:デフォルトの名無しさん
09/07/09 03:08:34
>>33
別にそーいうつもりは無かった。ただ単にちょっと面白かったのでネタとして投下してみた。

35:デフォルトの名無しさん
09/07/16 01:36:45
>>32
総まとめ:Javaの将来的な後継者としての Scala
URLリンク(www.infoq.com)
>Java の創作者である James Gosling 氏や
>JRuby の主要開発者である Charles Nutter氏に続いて,
>Groovy の創作者である James Strachan氏もScalaへの賛意を表明している。

36:デフォルトの名無しさん
09/07/16 01:45:28
でも流行るとは思えないなあ

37:デフォルトの名無しさん
09/07/16 09:48:26
Scala - The Next Five Years
URLリンク(www.scala-lang.org)

Scala Lift Off ('09/06)で、発表したスライドがあるな。

38:デフォルトの名無しさん
09/07/16 09:52:00
2.8の説明が中心で8割ぐらいあった。

39:デフォルトの名無しさん
09/07/16 15:51:24
RemoteActorで、1つのActorに複数のActorが高頻度でメッセージを投げると
たまにメッセージロストするんだけど、仕様ですか?

40:デフォルトの名無しさん
09/07/17 00:30:45
ScalaはJavaとべったりなのが嫌だなー

41:デフォルトの名無しさん
09/07/17 04:01:48
Javaとべったりになるための諸々を排除した「きれいなScala」を見てみたかった
という気はするけど、そうだったら今程注目を集めてなかっただろうなあと思う。

42:デフォルトの名無しさん
09/07/17 09:47:08
pizza, funnelがあってscalaらしいので、(JVMで動くけど)そっちがそういうのかな

URLリンク(www.artima.com)
URLリンク(pizzacompiler.sourceforge.net)
URLリンク(lamp.epfl.ch)


43:デフォルトの名無しさん
09/07/17 18:35:49
ドキュメントざっと読んでみた
pizzaはシンタックスはかなりJavaに近いけど、Generics,ファーストクラス関数,パターンマッチング等、Scalaの原型っぽい感じ
funnelはシンタックスはよりScalaよりな感じ&並行処理のためのプリミティブが入ってるのが特徴?
どちらにしても、Scalaの原型という感じで「きれいなScala」とはちょっとイメージが違うかなあ。

44:デフォルトの名無しさん
09/07/19 22:20:14
おすすめの入門コースを教えてくれ。
母語はJavaで、schemeとHaskellは少々分かる程度。
チュートリアルはぱっと見したが、基本的な文法概念がよくわからん。

45:デフォルトの名無しさん
09/07/19 22:52:45
Tutorialは和訳されてるけど、そっちの方読んだ?英語苦手なら和訳版読んだ方がいいかも

URLリンク(www.scala-lang.org)

英語だがProgramming in Scala買うのが一番お勧め。英語としては極めて平易
なんで読みやすいし、かなり丁寧に解説してくれてる。あとは、わからんことあったらこのスレで聞けば
誰かwが答えてくれると思う。このスレ、話題に飢えてるから。

46:デフォルトの名無しさん
09/07/19 23:20:49
>44
JavaとHaskellが分かれば、あとは何とかなると思うけど。
本は、「Beginning Scala」の方がJavaしか知らん初心者が通読する為の本
って感じで、リファレンス本的な感じが無い。

で、俺はLiftを使ってWebアプリを書いてみるのがいいと思う。
Scalaならではっぽい機能をかなり使ってるから、Scalaの学習に向いてる
気がするので。

47:デフォルトの名無しさん
09/07/20 00:56:44
やっぱ本読まないとだめかw
あのチュートリアルは面白そうというモチベーションは上げてくれるが俺の能力ではあれだけではコードは科研しな。
Liftは興味あるよ。つか、やりたい。
とりあえず金ないけどProgramming in Scalaの方をぽちった。パンの耳でもかじりながら読むよ。(要所を最後まで読了したことないんだけど…

48:デフォルトの名無しさん
09/07/20 01:19:43
つか、構文糖がいろいろあるっぽくて、釈然としないっつーか
なるほどという実感が持てない。だまされ続けてる感というかなんというか。

49:デフォルトの名無しさん
09/07/20 08:22:12
うーん。それだけだと何が釈然としないのかよくわからんなー。

50:デフォルトの名無しさん
09/07/20 16:59:42
「何でこれ、型が違うのにコンパイル通るんだよ! どこかに俺の知らない
オーバーロードがあるのか?」

「よく見たら、implicitな型変換が定義されてました」

ってのはありがちだが。

51:デフォルトの名無しさん
09/07/20 19:15:59
クラス定義があると?REPLがちゃんと動かない?
シェルでscalacが通るコードが、C-c C-bだとエラー。
Haskellだと無意識にC-c C-rしまくりなんだけど、みんなコーディングはどんな感じにやってるの?

52:デフォルトの名無しさん
09/07/20 20:58:13
コンパニオンオブジェクトは、REPLで通らないね。
コンパイル単位が別になってるってことみたい。
この場合は、objectで包む事で一時的に回避してる。

53:デフォルトの名無しさん
09/07/25 04:01:19
なるほど。ライブラリのソース見たところ、
objectひとつで1ファイルにする物みたいね。

しかし、Scala by example よいね。もしかして、本(Programming in Scala)要らなかった?

54:デフォルトの名無しさん
09/07/26 11:24:12
JavaとScalaの微妙な違い見つけた。

// Java
class A { public int field = 123; }
class B extends A { private int field = 456; }

// Scala
class A() { val field = 123 }
class B() extends A { private val field = 456 }

Java版はコンパイル通るけどScala版は通らない。
公開フィールドもサブタイピングにおける契約の一部とするとScalaが正しい。


55:デフォルトの名無しさん
09/07/27 16:09:50
>>54
それはちょっと違う。Javaが上記のコードでOKなのは、
サブクラスのフィールド定義がスーパークラスのフィールド定義を隠蔽(≠オーバーライド)しているから。
フィールドは静的な型だけに基づいて決まり、オーバーライドできない。

いっぽう、Scalaの場合、クラス定義におけるvalは一種のgetterのようなもので、オーバーライド
可能になってるので、public -> privateにするのは不可。

56:デフォルトの名無しさん
09/07/27 20:17:29
「Scalaのアクターのための性能を犠牲にしないで競合安全性を確保する型システム 」
URLリンク(www.infoq.com)

難解すぎて、わけわかめ><

57:デフォルトの名無しさん
09/07/27 23:20:22
>>55 その仕組みはわかってるつもりなんだけどJava版で使う段になってnew A().fieldがOKでnew B().fieldがNGなのは型的に正しいの?
それともA a = new B(); a.fieldでAのインターフェイスでとにかく使えるんだからいいということかな? まあそんな気もしてきた。


58:デフォルトの名無しさん
09/07/28 21:47:57
みんな開発環境にはなにを使ってる?Eclipse プラグインのやつ、どうにも不安定&イマイチで・・・
NetBeans がいいって聞くけど実際のところはどうなんだろ?

59:デフォルトの名無しさん
09/07/29 19:48:58
>>58
vim使ってるなあ。Odersky御大によれば、IntelliJ IDEAも良いらしい。

60:デフォルトの名無しさん
09/07/29 21:53:04
自分もvimですね。単にIDE使うほどにこだわりがないだけですけど。
ところでScala本の翻訳出るんだね。
URLリンク(www.amazon.co.jp)

61:デフォルトの名無しさん
09/08/06 00:31:53
メソッドを関数として扱うにはどうすればいいの?
いちいち{(xs, ys) => xs ::: ys}なんて書かずに、
たとえば(:::)に近いすっきりした書き方がしたい

62:デフォルトの名無しさん
09/08/06 01:14:07
_を使う。たとえば、
xs.::: _
みたいな感じ。ジェネリックなメソッドを関数として扱う場合、
xs.map[Int] _
みたいに明示的に型パラメータを指定してやらなければならないケースもある。

63:デフォルトの名無しさん
09/08/06 01:16:25
あ、レシーバも含めて関数にしたいのなら、
_ ::: _
とかかな。型推論が効かないケースだと、(_:List[Int]) ::: (_: List[Int])みたいに型注釈が必要な場合も。

64:デフォルトの名無しさん
09/08/06 01:17:21
Scala=Javaな人でOK?

65:デフォルトの名無しさん
09/08/06 01:22:20
100%がそうじゃないけど、Javaから乗り換えっていうケースが多いだろうね。
Javaの資産がそのまま使えるってのが大きなウリだから。ただ、外国で初期から
Scalaやってる人たちはFPのバックグラウンド持ってる人が多い印象(Scalaの開発者もそうだし)

66:デフォルトの名無しさん
09/08/06 02:19:17
ライブラリと実行環境の揃ってるHaskellとして。

67:デフォルトの名無しさん
09/08/06 08:05:25
ScalaやるようになったあとでJavaも勉強しだして結構Javaラーになってしまった。


68:デフォルトの名無しさん
09/08/06 08:27:12
Scalaから始めてよくJavaの煩雑さに耐えられるなあ。
自分はRubyに慣れてしまってるので、Scalaでもまだまだるっこしく
感じることが多々ある。

69:デフォルトの名無しさん
09/08/06 08:31:21
初期のJavaからやってたら、Javaも随分楽になったなあと思うけどな

70:デフォルトの名無しさん
09/08/06 09:25:39
まあ糖衣構文は増量されたと思うけどね
さすがにモダンな言語と比べるとコアの構文が弱すぎる
期待の星だったクロージャも……

71:デフォルトの名無しさん
09/08/10 18:59:06
俺も正直、Javaを馬鹿にしていたが謝りたい
特にconcurrent関連。いやそれのみに対して。

72:デフォルトの名無しさん
09/08/15 21:05:10
>70
期待の星だったクロージャも……

Clojureのことだとおもた・・

73:デフォルトの名無しさん
09/08/16 18:27:58
>>60
池袋ジュンクで先行販売していましたよ。

74:デフォルトの名無しさん
09/08/16 18:28:49
>>70
モダンな言語って?

75:デフォルトの名無しさん
09/08/16 18:31:37
HaskellとかRubyとか

76:デフォルトの名無しさん
09/08/16 18:33:23
Haskellはともかく、Rubyはどうだろ
便利に使わせてもらってるが、モダンとは何か違う気がする
クラシックな言語の良さをそのままに、モダンな機能もちょっと取り入れた的な

77:デフォルトの名無しさん
09/08/16 18:46:03
Rubyでモダンじゃなかったら、それこそScalaくらいしかモダンじゃなくなる
それにHaskellの方がJavaより古い言語だ

78:デフォルトの名無しさん
09/08/16 19:34:17
年代的な新旧よりも仕様面ではどうなん?
F#とかw

79:デフォルトの名無しさん
09/08/16 19:50:42
F#ってOCamlと言語的になにか違うのか?

80:デフォルトの名無しさん
09/08/16 20:08:59
>>73
なぬ!買わねばっ!

81:デフォルトの名無しさん
09/08/16 20:28:01
>>60
「JavaからRubyへの移行を考えている人も必読」とか紹介してるけど、
Scalaの後でRuby見たら、なにこの手抜き言語?としか思わんだろう

82:デフォルトの名無しさん
09/08/16 22:20:21
>>79
OCamlのサブセットです

83:デフォルトの名無しさん
09/08/16 22:41:53
言語仕様の意味で包含関係って、Ocaml⊃F#でしたっけ?

84:デフォルトの名無しさん
09/08/17 01:03:00
サブセットじゃないだろ。Active PatternとかF#にあって、OCamlに無い機能も
あるし、オブジェクト指向周りの仕様も別物のはず。

85:デフォルトの名無しさん
09/08/17 18:50:40
「関数型=モダンかよ!」by Mercury,Oz,Gödel,...

86:デフォルトの名無しさん
09/08/17 19:21:25
ゲーデルなんて言語があったのか、知らんかった
なんか随分前に開発止まってるみたいだけど

関数型そのものはモダンではないよね
オブジェクト指向言語に関数型の機能を入れるのが最近の流行なだけで

87:デフォルトの名無しさん
09/08/17 19:44:40
モダンな関数型とかあるんじゃねーの、と適当に言ってみる

88:デフォルトの名無しさん
09/08/17 19:50:27
モダンでもレトロでも使われなきゃおじゃんだねw
scalaはその点、出だしからいい位置に居るんじゃないかな

89:デフォルトの名無しさん
09/08/17 20:00:50
関数型は並行プログラミングが流行なのかね
Erlangとか、このScalaとか
個人的に今のところあまり必要としてないんだけど

90:デフォルトの名無しさん
09/08/17 20:04:19
マルチコア環境が普通になったからね

91:デフォルトの名無しさん
09/08/17 22:22:44
UGM系の携帯・WebサイトだとそこそこでもC10Kとかプッシュ型非同期処理とか考えないといけないけど
単価をいかに下げるかの世界だから、サーバの台数を減らしたり、楽に効率あげれそうなものに飛びついて
試してる面もある。Web+DBとかの執筆者の影響で始めてみようという人もいるんじゃないかな?
逆にHPCの世界の人は、大規模な問題を相手にしてるから、ベクトルの代わりにいかにGPU,CELLを並列にチューニングして
使うかの方向が多いよね。

Scalaスケーラブルプログラミング[コンセプト&コーディング]
URLリンク(www.impressjapan.jp)
翻訳本の公式ページにエラッタも出てた。
監修者あとがきは気合いはいってるけど、訳はどうかな。

92:デフォルトの名無しさん
09/08/17 22:29:49
600ページの本を電車内で読むのはつらい。
日本でもKindle売ってくれたらいいのに。

93:デフォルトの名無しさん
09/08/17 22:58:23
文法上は並行プログラミングになってるけど、実際に必ず並列動作するコードが吐き出されているのだろうか?

94:デフォルトの名無しさん
09/08/17 23:50:19
>>92
ページ数の割には薄い。薄い紙を使ってるそーで、裏のページが透けて見えたw

95:デフォルトの名無しさん
09/08/17 23:58:37
破れそうで怖いな

96:デフォルトの名無しさん
09/08/18 00:55:11
洋書と殆ど値段変わらないじゃないか…

97:デフォルトの名無しさん
09/08/19 02:05:56
>93
>文法上は並行プログラミングになってるけど、実際に必ず並列動作するコードが吐き出されているのだろうか?

文法上どこが並行かわからんけど、(どこのこと?)

並列動作は明示的にThreadをコントロールするコード書かないとダメ。

Actor使えば必ず並行かと言われるとそうでもない。Actorを1つしかNewしなければ、逐次動作と変わりない。

MailBox(と呼ばれているキュー)に突っ込まれたデータを、プログラムしたとおり、順々に処理するだけだからね。


98:97
09/08/19 02:52:52
>Actor使えば必ず並行かと言われるとそうでもない。Actorを1つしかNewしなければ、逐次動作と変わりない

MainスレッドとActorのWorkerThreadが別々に動くから、並行っちゃ並行だったので訂正。

それだけだとなにが嬉しいのかわからないから、素直にErlang囓る事を勧めるよ。

99:デフォルトの名無しさん
09/08/19 16:50:18
>>96
良いの?嫌なの?

100:93
09/08/19 20:00:29
>>98
もうかじったよw

で、スレッドをコントロールするコードを書くと結局どうなるん?
というかOSの仕組みを借りないと並列実行できないの?

もしかしてかなり基本的な疑問か…orz

101:デフォルトの名無しさん
09/08/19 23:28:03
そんな質問がでるってことは基礎から足りないね
なんか本とか読んでみたの?

102:デフォルトの名無しさん
09/08/20 22:38:50
本当にペラペラな紙だな
本自体も厚さの割りにふにゃふにゃだった
内容は知らん

103:デフォルトの名無しさん
09/08/20 23:46:08
さすが>>102さん、知性あふれる書評ですね!クール!
マジすごいよ君の脳は!

104:デフォルトの名無しさん
09/08/21 06:17:12
>>102
すごく参考になりました。やはり本は内容より紙質ですよね。

105:デフォルトの名無しさん
09/08/21 12:01:37
俺も今Amazonから届いたよ
確かに薄いな、ジャンプより薄い
装幀も悪くないし、うん、これは良い本だ

106:デフォルトの名無しさん
09/08/21 12:52:51
買ってみたくなった

107:デフォルトの名無しさん
09/08/21 19:34:22
紙質にはこだわったと監修者が言ってたからな

108:デフォルトの名無しさん
09/08/21 19:47:45
内容よりもまず紙質が評価されているだと……?

109:デフォルトの名無しさん
09/08/21 20:15:13
内容は既に保障済みだからな
今更語ることといえば、紙質ぐらいしかない

110:デフォルトの名無しさん
09/08/21 21:19:08
紙質がいまいち

111:デフォルトの名無しさん
09/08/21 21:54:49
この紙って高いの?安いの?

112:デフォルトの名無しさん
09/08/21 22:09:56
紙が薄いと、ScanSnapで重送してしまう。

113:デフォルトの名無しさん
09/08/21 22:18:00
薄くても安心

114:デフォルトの名無しさん
09/08/21 22:45:28
ページが多い日も安心

115:デフォルトの名無しさん
09/08/21 22:54:52
モダンな言語って、生まれた時期もあるが、注目されてきた時期も関係するんじゃないの
あと、仕様にミスが少ないとか

116:デフォルトの名無しさん
09/08/21 23:14:24
紙がペラペラで薄かったりとか

117:107
09/08/22 10:03:40
上質な薄い紙にしたので、コストが上がったらしい。出来るだけ薄くしたかったので譲れなかったと。

118:デフォルトの名無しさん
09/08/22 11:41:55
紙に拘るより、PDFで売ってくれた方が嬉しいけどな。

119:デフォルトの名無しさん
09/08/22 12:12:46
PDF(笑)

120:デフォルトの名無しさん
09/08/22 12:37:44
Javaスクール卒業生向けの関数型言語ですね。わかります。

121:デフォルトの名無しさん
09/08/22 12:43:24
だんこがいが褒めてるのを見て実は駄目な言語じゃないかと思いはじめた

122:デフォルトの名無しさん
09/08/22 16:57:05
そこはせめて自分の感覚とも相談しろよ・・・・・

123:デフォルトの名無しさん
09/08/22 19:43:03
Scalaスケーラブルプログラミング
これ詠む価値ないです
原著を読んでください

124:デフォルトの名無しさん
09/08/22 20:04:52
訳が悪いとか?

125:デフォルトの名無しさん
09/08/22 20:11:07
紙が撓んで読む気がなくなります。

126:デフォルトの名無しさん
09/08/22 20:14:31
やはり紙か

127:デフォルトの名無しさん
09/08/22 21:00:43
今回の翻訳本の語彙は、別の人に少しはチェックしてもらったらしいが、
金取ってるなりに、情報系の対訳集ぐらい出版社なり業界なりでメンテナンスしてほしいな。


あと、clojureの話ってどこでやってるんだ。どうしようもない質問があるんだが・・・

公式のjarだけだと *compile-path* 規定のclassesフォルダ作っても:gen-classのcompileが通らないが、どうすればいいんだ。
ちなみに、「Programming Clojure」で配布しているプログラミング環境のセットだと通る。
URLリンク(www.pragprog.com)



128:デフォルトの名無しさん
09/08/22 21:11:59
そもそもJVMで動くっていうのがきもい
JVMがないと何にもできない糞言語ってことだろ?

129:デフォルトの名無しさん
09/08/22 21:40:38
>>128
.NET版なかったっけ

130:デフォルトの名無しさん
09/08/22 21:53:21
>>128
そんなの言い出したら、処理系がVMで実装されてる言語がほとんど当てはまるがな。
○○はVMがないと何もできない糞言語、ってね。

131:デフォルトの名無しさん
09/08/22 22:08:07
Javaはいかんだろ

132:デフォルトの名無しさん
09/08/22 22:14:53
JVMがないと何も出来ない⇒糞言語

て理論がまず分からんわ
なので、今のところ>>128が糞。これなら分かるw

133:デフォルトの名無しさん
09/08/22 22:25:15
俺もJVMとXMLリテラルは言語の普及には貢献するだろうが、寿命は縮めると思うね

134:デフォルトの名無しさん
09/08/22 22:26:52
どうせドカタ言語になるだろw

135:デフォルトの名無しさん
09/08/22 22:46:32
>>133
時期が近いGroovyも埋め込みマークアップをサポートしてるのを見ると
流行りなんじゃないのかなあ
個人的には、XMLリテラルは好きでない
言語が依存するほどXMLが絶対的だとは思えないので

JVMはまあ、設計上の選択ということで何も言わないことにする
膨大な資産が投下されてるものを利用したくなるのは分かる

136:デフォルトの名無しさん
09/08/22 22:52:42
>>128
言語と処理系を切り離して考える程度の知恵もないのか?

137:デフォルトの名無しさん
09/08/22 23:59:31
for( hoge -> list )
の->はなんなのでしょうか?




138:デフォルトの名無しさん
09/08/23 00:05:45
>>137
矢印逆じゃね?

139:デフォルトの名無しさん
09/08/23 16:04:37


140:デフォルトの名無しさん
09/08/23 19:27:05
矢印逆だった

141:デフォルトの名無しさん
09/08/25 00:49:33
JVM使うのは基本的に正解だろ。
銀行などシビアなユーザーを含む膨大なユーザベースに叩かれていて、
長年の投資が蓄積されていて、今後も当面投資される見込みの物があるのに、
いまさら車輪の再発明を推すのはアホだろ。選択と集中。
ほかのソフトに依存するのが駄目って奴は、OSのない時代に帰ったら?

142:デフォルトの名無しさん
09/08/25 07:27:03
誰か答えてあげて
スレリンク(tech板)l50


143:デフォルトの名無しさん
09/08/25 07:35:01
>>141
途中までまともなこと言ってるんだから、
最後の一行でただの極論馬鹿に落ちぶれなくてもいいのに。

144:デフォルトの名無しさん
09/08/25 08:58:08
JVM上での言語実装が流行っているのって、
枯らすのに手間暇かかるインターフェース周りの
ライブラリをいちいち作りたくないから。
JVM上に実装するにしろ、.netにするにしろ
そのような面倒などころは先行している実用言語にお任せ。
そうでもしないと、なかなか実用レベルに到達しないだろ。

145:デフォルトの名無しさん
09/08/25 10:45:00
>>141
デブ元理事?

146:デフォルトの名無しさん
09/08/25 11:50:45
>>141
うざい

147:デフォルトの名無しさん
09/08/25 12:23:42
馬鹿丸出しの>>141を論うスレになりました。
Windowsネイティブexeにならない言語なんて意味ねぇんだよ、バーカw

148:デフォルトの名無しさん
09/08/25 14:50:06
ここにもネイティブ厨が

149:デフォルトの名無しさん
09/08/25 23:24:33
>>141
賛同します。

150:デフォルトの名無しさん
09/08/25 23:36:38
そんなシビアな環境なのに
今仕事がまったく無いJVMなのでした

チャンチャン

151:デフォルトの名無しさん
09/08/26 01:47:03
嘘ついてチャンチャンとか締めてもなぁ。

152:デフォルトの名無しさん
09/08/26 04:56:44
そいやFlightCasterというサービスがClojure使ってるらしいが
LispやSchemeでないのはやっぱJavaの資産の利用が重要だからなのかな。

JVM上の言語はイレージャなどJVMに縛られる部分がどうしてもでてくるからなぁ。


153:デフォルトの名無しさん
09/08/26 23:52:24
JVM上のlispは、どれぐらいの速度が出るのか調べようとおもったけど、上手くいかなかった。

どのバージョンか見てないけど、ネイティブのsbcl/scalaで、これぐらい
URLリンク(shootout.alioth.debian.org)
URLリンク(shootout.alioth.debian.org)

lisp-2からlisp-1に変換する知識無いので、clojureとkawa(scheme)の計測はできてないし、
そのまま動くはずのabcl(cl)とかもwin環境でいまいち上手く設定できずに出来なかった。orz

全然関係ないけど、on lispとPractical common lispのサンプルをclojure用に一部変換したやつがあった。
URLリンク(github.com)
URLリンク(github.com)

154:デフォルトの名無しさん
09/08/27 00:12:44
URLリンク(codemonkeyism.com)
Clojure Scalaでググるとこれが一番上にきてた。バランス取りすぎと思える内容だ

155:デフォルトの名無しさん
09/08/27 23:33:52
スケーラブルプログラミングより
言語仕様詳細に説明してある資料ってどれですか?

156:デフォルトの名無しさん
09/08/28 00:01:36
公式落ちてる?それともDNS関係?

157:デフォルトの名無しさん
09/08/28 00:05:16
>>155
Documentation > Manuals
URLリンク(www.scala-lang.org)
# Scala Language Specification
# The SID Library

Language Research
URLリンク(www.scala-lang.org)
* Papers

のあたり


158:デフォルトの名無しさん
09/08/28 00:26:04
関数リテラルがよくわからない
困った

159:デフォルトの名無しさん
09/08/28 01:08:37
>>158
それは別にScala特有の話じゃないでしょ
Rubyのブロックも同じようなもんだし
無名関数とも呼ばれるから調べるならその辺も

160:デフォルトの名無しさん
09/08/28 01:10:29
内部状態を保存するから、一時変数を外に持たなくていいとか(レキシカルスコープ?局所変数?)
適用した時点で評価されるとか(遅延束縛)
とかになるとかのところかな?

Y(X(x)) |x=2 = Y * X(x) |x=2とか
実行中に、結果だけじゃなくて、構造を残してるからみたいなことだよね。

参考資料は、
多忙な Java 開発者のための Scala ガイド: オブジェクト指向のための関数型プログラミング
URLリンク(www.ibm.com)
ほかの言語だとこんな説明があるけどどうだろう。
JavaScriptにおける高階プログラミング
URLリンク(d.hatena.ne.jp)
on lisp 2. 関数
URLリンク(www.komaba.utmc.or.jp)


・・・実は全然分からんので、とりあえず知ったかしてみた。

161:デフォルトの名無しさん
09/08/28 01:27:29
Scalaの関数リテラルはscala.FunctionXXを実装している。
関数の呼び出しは、Function#applyの呼び出しに変換される。

finalじゃないローカルスコープ変数を触れることを除けば、
Javaの匿名クラスと変わらないよ。

162:デフォルトの名無しさん
09/08/28 07:22:37
じゃあhaskellの
無名関数より機能劣るんだな

163:デフォルトの名無しさん
09/08/28 08:40:58
>>162
何故そうなる。Haskellの無名関数とほぼ同じ程度の機能はあると思うが
具体的に劣ってる部分挙げてみてよ

164:デフォルトの名無しさん
09/08/28 08:43:22
>>161
>finalじゃないローカルスコープ変数を触れることを除けば、
>Javaの匿名クラスと変わらないよ。
これは話が逆で、Javaの匿名クラスは
・記述が冗長である
・外側のスコープのローカル変数についてはfinalなものしか触れない
という点を除けば無名関数と同じようなものだ、という方が適切だと思う。歴史的には
無名関数の方が古い機能だし

165:デフォルトの名無しさん
09/08/28 12:28:02
Scalaを弄り始めて関数リテラルが良くわからないってことは、
Java経験者である確率が高い。

だから、Javaならこうなるという説明をしたんだよ。

166:デフォルトの名無しさん
09/08/28 20:21:35
それが余計意味を解らなくするからやめて欲しい
javascriptで比較するのならまだ許されるけど

167:デフォルトの名無しさん
09/08/28 20:50:01
def w(file File, op: PrintWriter => Unit ) {
val sriter = new PrintWriter(file)
try{
op(writer)
} finally {
writer.close()
}
}

op(writer)を実行するとPrintWriter => Unitはどう利用されるの?

168:デフォルトの名無しさん
09/08/28 21:17:05
つーか、まず動く例にしろよ
変数の綴りとか間違ってるぞ

import java.io.File
import java.io.PrintWriter

def w(file: File, op: PrintWriter => Unit ) {
val writer = new PrintWriter(file)
try{
op(writer)
} finally {
writer.close()
}
}

w(new File("hello.txt"), _.println("hello"))

こんなんか?
で、質問の意味がわからん
「PrintWriter => Unit」って型だぞ
opという変数に関数オブジェクトが代入されて実行されるだけだ

169:デフォルトの名無しさん
09/08/28 21:30:05
PrintWriter => Unitってどんな型なのかよくわらかん
引数も取らん関数がなぜUnitを返せるんだ?

170:デフォルトの名無しさん
09/08/28 21:44:12
>>169
Scalaには引数を取らない関数なんてないぞ
PrintWriter => Unitって言うのは、「PrintWriterオブジェクトを引数にとって、Unitを返す関数」の型だ

171:デフォルトの名無しさん
09/08/28 21:53:25
>>170
えーとそうすると
op(writer)ってところは何が実行されるの?


172:デフォルトの名無しさん
09/08/28 22:00:25
>>171
opに代入された関数オブジェクトが、writeを引数にとって関数として実行される
上の例で言えばwの呼び出し引数の「_.println("hello")」という関数リテラルが実行される

173:デフォルトの名無しさん
09/08/28 22:39:51
>>172
無名関数 != 関数リテラル

なんですよね?この関数リテラルってなんなんですかね?

174:デフォルトの名無しさん
09/08/28 22:45:28
関数リテラルはカリー化ができない。

175:デフォルトの名無しさん
09/08/28 22:55:17
無名関数、関数リテラル、匿名関数、みんな同じものだよ
一般的に○○リテラルというのは、オブジェクトを直接生成する表現のこと

例えば、プログラム中の「1」はIntリテラルで、
val a = 1
と書けば、1の値のIntオブジェクトが生成されて変数aに代入される
同じように関数リテラルの場合は、
val f = (a: Int) => println(a)
と書けば、Int型の引数aを取ってプリントする関数が生成されて変数fに代入される
その後でf(1)と関数を呼び出せば、1がプリントされる

176:デフォルトの名無しさん
09/08/28 22:58:48
つーか、そもそもオブジェクトを生成っておかしくないか。
最初から全部オブジェクトな言語はどうなるんだと。

177:デフォルトの名無しさん
09/08/28 23:04:29
>>176
最初から全部オブジェクトな言語って具体的に何のことだ?

178:デフォルトの名無しさん
09/08/28 23:11:48
>>176
横からだが、もう少し詳しく書いてくれんか

179:デフォルトの名無しさん
09/08/28 23:18:04
まあ、リテラルは定数だから必ずしもオブジェクトを生成するわけではないか

180:デフォルトの名無しさん
09/08/28 23:20:48
なんつーか、Java関係の業界って難しそうな用語勝手に作ってるけど、
他の用語よりも内容はショボいってこと多くない?

181:デフォルトの名無しさん
09/08/28 23:30:48
>>179
Scala言語的には一貫して生成と解釈したほうがスムーズでない?
実装上、そうならない可能性もあるにせよ
(そもそも定数畳み込みとかで消えるかも分からん)

182:デフォルトの名無しさん
09/08/28 23:32:06
>>180
具体的になんのことだ
関数型のリファレンシャル・トランスペアレンシーとか
ポリモーフィック・タイプ・インファレンスの方が難しそうだろ?
このスレでも躓いてるやつは関数型系の用語の方だと思うが

183:デフォルトの名無しさん
09/08/28 23:32:53
>>179
リテラルが定数って理解も間違ってるでしょ
C/C++のconstで定義した定数はリテラルではない
リテラルは「文字通りの」って意味で字面がそのままオブジェクト/値として解釈される
文字列リテラルとかMapリテラルとか正規表現リテラルとかXMLリテラルとか
解釈された結果のオブジェクト/値が必ずしも定数である必要はない

184:デフォルトの名無しさん
09/08/28 23:36:06
でも定数じゃないリテラルってあるのか?
昔のCは定数の文字列を書き換えられたと聞いたことはあるけど

185:デフォルトの名無しさん
09/08/28 23:39:31
>>184
リテラルそのものとそれが解釈された結果の値やオブジェクトを区別してる?

186:デフォルトの名無しさん
09/08/28 23:41:28
うーむ後もう1つ解らないのですが

def f (x: Int) (y: Int) = x - y

これって引数は2個あるのですか?この意味がよくわかりません

187:デフォルトの名無しさん
09/08/28 23:41:45
>>185
細かく言えば、リテラルというのはプログラム上の表現であって実態は持たないのだが、
そういう話をしたいのではなくて、生成された(あえてそう言うけど)オブジェクトが
定数じゃないことってあるのか?という意味

188:デフォルトの名無しさん
09/08/28 23:53:01
>>186
これはカリー化された関数だね
存在意義をこの短いレスで説明するのはちょっと難しい
とりあえず
def f (x: Int) (y: Int) = x - y
は、f(1)(2)みたいに呼び出して、
def f (x: Int, y: Int) = x - y
は、f(1,2)みたいに呼び出すと覚えて、詳しくはいずれ学ぶといいよ
この二つの関数の動作自体は同じ、呼び出し方が違うだけ

189:デフォルトの名無しさん
09/08/29 00:11:54
>>188
カリー化の書き方なのですか。難しい書き方ですねぇ

カリー化って多変数関数
f(x,y,z)を
(λx.(λy.(λz.M)))
と表現できるってやつであってますか?

あとScalaでは、不動点演算子ってどれなのでしょうか?

190:デフォルトの名無しさん
09/08/29 00:17:31
>>187
ある。Rubyの文字列リテラルによって生成されたオブジェクトは定数じゃないし、
配列リテラルやMapリテラルによって生成されたオブジェクトが定数の言語って知らないし

191:デフォルトの名無しさん
09/08/29 00:22:56
うわ、ほんとだ、Rubyで
"abc".sub!("a", "1")
と書いたら動くわ、気持ち悪っ
というわけで、一般的にリテラルが定数というのは訂正させていただきます

192:デフォルトの名無しさん
09/08/29 00:32:30
>>189
いや、まあ、それであってると言えばあってるけど、
理解するには関数型言語のどれかをちょっと触ってみた方がいいと思う

不動点演算子ってYコンビネータとかのこと?
それってあるものじゃないでしょ
作ろうと思えば作れるけど
どこで調べてきたんだ

193:デフォルトの名無しさん
09/08/29 00:42:17
>>190
ScalaのMapリテラルはimmutableだよ。何もしなければ。


194:デフォルトの名無しさん
09/08/29 06:44:39
関数型言語の中でscalaに一番似てそうなのってなにかな
OCaml?
オブジェクト指向と関数指向をどこでどう使えばいいか
参考にできそうかしらん?

195:デフォルトの名無しさん
09/08/29 10:55:21
HaskellよりはOCamlの方が似てるかな
オブジェクト指向と関数型の融合という点では参考にならんと思うけど

196:デフォルトの名無しさん
09/08/29 11:12:23
盛り上がってるな。やっぱ本の影響か?

197:デフォルトの名無しさん
09/08/29 20:06:28
>>194
>オブジェクト指向と関数指向をどこでどう使えばいいか
これ、参考例がほしいなあ

最近CTMCPを読んでるが、方法論の選択は「問題に合うものを使え」とのこと
例えば、宣言的モデルで解こうとすると、表現力が足りなかったり逆に複雑になるような問題には
明示的な状態操作で対応しろと

理屈は分かる気がするが……どうすりゃいいのよw
結局は経験則しかないのかね

198:デフォルトの名無しさん
09/08/29 20:55:20
Common-LispのletってどうやってScalaで書けばいいのですか?

199:デフォルトの名無しさん
09/08/29 21:04:54
>>197
設計はオブジェクト指向でやって、あとはなるべく参照透明性があるように書けばいいんじゃないの

200:デフォルトの名無しさん
09/08/29 21:13:20
>>198
letってローカルスコープ決めるだけじゃないの?
なにがしたいの?

201:デフォルトの名無しさん
09/08/29 22:48:08
>>199 まあImmutableパターンをつかったJavaみたいな感じだよね。
>>198 >>200 あえてCommon Lispのっていうところをみると動的スコープのletかなあ。だったらDynamicVariableを使うんだけど。

202:デフォルトの名無しさん
09/08/29 23:37:07
Scalaの入門ドキュメントや本を見るとvalとimmutableマンセー状態なのに、
クラスライブラリのソース見るとvarとmutableだらけな件は、
どう解釈したらいいの?

速度が問題にならないところだけimmutableにしろと?

203:デフォルトの名無しさん
09/08/29 23:57:39
基本ライブラリは効率優先に実装せざるをえないからなあ

204:デフォルトの名無しさん
09/08/30 00:19:23
>>202
コレクションライブラリは一番基盤になる部分で、実行効率最優先だからvar使いまくり
なのは仕方無い。ユーザが自分で作るプログラムの部分でvar使うかどうかは、目的によるけど
普通のアプリケーションならほとんどはimmutableで大丈夫じゃないかなあ。ベンチマーク取ってみれば
わかるけど、immutableしたからといってそれほど劇的に遅くなるわけじゃないし。

205:デフォルトの名無しさん
09/08/30 00:21:33
あと、内部がvar使いまくりであっても、ユーザからはちゃんとimmutableに見える使い方(scalaListとか)
なら問題が少ないってのもあるな。つまり、副作用がローカルに閉じてれば問題ないってこと。

206:デフォルトの名無しさん
09/08/30 00:43:41
その辺は、 private[パッケージ名] var のアクセス制限が
うまく作用してる点ではある。

207:名無しさん@そうだ選挙に行こう
09/08/30 19:23:33
引数に

Int => Int
(Int => Int, Int) => Int

の2つの関数を取りIntを返すって式はどうやって書けばいいの?

def f((Int => Int, (Int => Int, Int) => Int) => Int

じゃないような気がするけど、うーん

208:デフォルトの名無しさん
09/08/30 20:18:53
>>207
関数を定義するだけなら、例えばこうだけど
def f(f1: Int => Int, f2: (Int => Int, Int) => Int): Int = 1

君は根本的にプログラミングを理解できてないと思うね
まずJavaあたりをしっかり勉強した方がいい

209:デフォルトの名無しさん
09/08/30 20:22:24
まずJavaあたりをしっかり勉強した方がいい(キリッ

210:デフォルトの名無しさん
09/08/30 20:41:02
>>208
そうなんですかぁ

うっせーぞボケ
リアルでやるぞコラ

211:デフォルトの名無しさん
09/08/30 21:02:53
例えば、
def f((Int => Int, (Int => Int, Int) => Int) => Int
と書いたときに仮引数の名前がないじゃない
タイプ・シグネチャと混同したのかもしれないと思ったけど、
ScalaもJavaもタイプ・シグネチャは定義できないと

つまり、Javaレベルの知識もないまま、
Scalaを勉強しようとしてるみたいだから、
Javaから勉強しないと意味がないよと

212:デフォルトの名無しさん
09/08/30 21:42:50
>>210
「君は根本的にプログラミングを理解できてないと思うね
まずJavaあたりをしっかり勉強した方がいい」

この部分は要らないゴミコメントだから気にするなw

213:デフォルトの名無しさん
09/08/30 22:04:43
最近ずれた質問してる人は全部この人でしょ?
だからそろそろはっきり言ってあげた方がいいと思ったんだよ

プログラミング初心者が学ぶには不適当な言語だよ、Scalaは
とりあえずJavaをちゃんと覚えてからでいいじゃない
どうせライブラリで使わざるをえないんだから

214:デフォルトの名無しさん
09/08/30 22:13:52
バカでもScalaに触る時代がきたんだなぁ

215:デフォルトの名無しさん
09/08/30 22:17:09
>>214
Scala本の影響が大きいんだろうね
基本的にはいいことなんだけど

216:デフォルトの名無しさん
09/08/30 22:18:30
まぁなんでもいいや
解らんことここで聞けるし



217:デフォルトの名無しさん
09/08/30 22:26:48
>>214
どうして、こういう人を見下す言動が耐えないんだろうね。屑人間が増えたのかね

218:デフォルトの名無しさん
09/08/30 23:20:37
屋根上屋根ではあるんで、
プログラミング自体はRubyやPythonで、静的型付けはJavaがいいかもな。

219:デフォルトの名無しさん
09/08/31 00:04:09
計算可能性とラムダ計算とSICP見ながら、こんなの作ったんだけどあってるかな?
もっと正しい方法あったら教えてください

object TestScala {
def main(args: Array[String]) {
println("TEST1")
println(zero(_ + 1, 0))
println(one(_ + 1, 0))
println(two(_ + 1, 0))
println(three(_ + 1, 0))
println(four(_ + 1, 0))
println(five(_ + 1, 0))
println(plus(two, five, _ + 1, 0))
println(multi(five, five, _ + 1, 0))
}

def zero (op: Int => Int, x: Int) = x
def one (op: Int => Int, x: Int) = op(x)
def two (op: Int => Int, x: Int) = op(op(x))
def three (op: Int => Int, x: Int) = op(op(op(x)))
def four (op: Int => Int, x: Int) = op(op(op(op(x))))
def five (op: Int => Int, x: Int) = op(op(op(op(op(x)))))
def plus (m: (Int => Int, Int) => Int,
n: (Int => Int, Int) => Int,
s: Int => Int,
x: Int) = { m(s, n(s, x))}
def multi (m: (Int => Int, Int) => Int, n: (Int => Int, Int) => Int, s: Int => Int,x: Int) = {
def N1(n0: (Int => Int, Int) => Int, s0: Int => Int) ={ (x: Int) => n(s, x) }
m(N1(n, s), x)
}
}


220:デフォルトの名無しさん
09/08/31 01:03:43
チャーチ数の実装か、かけ算のところって、

def multi(m: (Int => Int, Int) => Int, n: (Int => Int, Int) => Int, s: Int => Int, x: Int) = m(n(s, _:Int), x)

でいいんじゃないの?つーか、N1って何をやってるんだ?

221:デフォルトの名無しさん
09/08/31 06:42:01
>>217
一足早く先進的(笑)な言語を触ったことだけが自慢の、
ろくなもん作れてない低脳だから。
最初にScalaを触った年月日の古さを呟くだけで射精できるらしいよ。

222:デフォルトの名無しさん
09/08/31 10:46:06
バカと言われただけでそんなに煽られてると感じるなら
その先進的(笑)な機能の話をすればいいじゃない
それ以前の話ばっかじゃないか

Scalaの大部分の機能は他の言語の素養があればすぐ使えるようになるよ
それもないのにいきなりScalaを触ろうとして躓くのが問題
もっと解説が多くて基本的な言語はいっぱいある

223:デフォルトの名無しさん
09/08/31 10:53:45
いいぞいいぞ!
もっと言いあえ!

224:デフォルトの名無しさん
09/08/31 20:02:25
低能相手に慣れ合いするのが楽しいの
低能に付き合ってあげているやさしい自分が自慢なの

225:デフォルトの名無しさん
09/08/31 23:05:08
>>220
なるほど、なるほど

m(n(s, _:Int), x)とかけばいいのですか
ところまたまた質問しますが

n(s, _:Int)と記述したときの、_:Intは関数を渡したことなるのですか?

226:デフォルトの名無しさん
09/08/31 23:31:21
いや、関数の部分適用だよ
Scalaの関数はカリー化されてなくても部分適用ができる
n(s, _:Int) は (x: Int) => n(s, x) と書くのと同じ

227:デフォルトの名無しさん
09/08/31 23:38:29
>>225
えーとN1は>>226殿によると
部分適用するのと等価な書き方のようです。

>>226
なるほど、書き方が冗長なのが解りました。

228:デフォルトの名無しさん
09/09/01 00:41:31
>226
そんな書き方有ったのか。
Scalaは部分適用が不得意なイメージが有ったが、そうでもないんだな。

229:デフォルトの名無しさん
09/09/06 13:24:57
本がでてたのみつけて少しずつ読み始めたけどなんか書き方が気持ち悪く感じる
部分適用とかも val f = sum _ みたいな _ つけるのとか
理由はちゃんと書いてあるけどそれってJavaの仕様から言語仕様を決めてる?
g(args : String*) を Array に適用するにも g(arr: _*) みたいなのとか

230:デフォルトの名無しさん
09/09/06 15:26:06
カリー化は別にあるけど、そういうことじゃなくて?

231:デフォルトの名無しさん
09/09/06 22:32:33
過疎が酷いな
消えるの早すぎw

232:デフォルトの名無しさん
09/09/06 22:58:23
まだ9章途中だからやっとカリー化
カリー化可能関数とふつうの関数の書き方が違うのか
でもやっぱり val onePls = curriedSum(1)_ とか最後の _ がかっこわるい
println(hoge) を println { hoge } でもいいとかううーん

233:デフォルトの名無しさん
09/09/07 00:02:11
>>232
関数オブジェクトを作るために_を付けるという構文は、
Scalaがフィールドとメソッドの名前空間を区別してないからってのもあるだろうな
間違ってメソッドをフィールドみたいに使っちゃって関数渡しになっちゃうのを防ぐみたいな
そういうのはほとんど型チェックで引っ掛かりそうな気もするけど

{}が使えるのはDSLのためでしょ

あと、微妙に「カリー化」という言葉の使い方が間違っているような

234:デフォルトの名無しさん
09/09/07 09:35:02
ちがってた
f()() とか定義した時点でカリー化関数っていうんだ
もとの関数を引数を別々に固定できるように変換するのをカリー化というと思ったので誤解
() とか {} はオペレータとして定義できればいいのじゃんと思ったけどそうでないよね

235:デフォルトの名無しさん
09/09/07 19:25:05
>>232
> println(hoge) を println { hoge } でもいい
これって中括弧でもよい、という話だったのか・・・
右側のはてっきり小括弧が省略されているのだと勘違いしてた。
println( {hoge} )

やっぱ本読むかなんかしないと、間違ってる知識がいろいろありそうな

236:デフォルトの名無しさん
09/09/07 20:45:52
Scalaで括弧が省略できるのはレシーバを書いたときだけだからね
Console println "abc"
みたいに

237:デフォルトの名無しさん
09/09/07 23:34:41
def f : hoge =

のhogeって引数になるのですかね?

238:デフォルトの名無しさん
09/09/08 00:49:21
引数?それだと、hogeは戻り値の型だよ。

239:デフォルトの名無しさん
09/09/10 02:24:58
NetBeansのプラグインを使った環境でプロジェクトに外部のjarを参照させ、
importすると、認識されず型に関する表示が全部errorになってしまうのですが、
なにか使い方が間違ってるんでしょうか?
jdkのsrc.zipに入っているjarのみ認識しているようですが、
import文を書いた瞬間errorになります。



240:デフォルトの名無しさん
09/09/10 02:59:52
>239
IntelliJってのを買うといいらしいよ。

241:デフォルトの名無しさん
09/09/10 13:32:10
ちゃんと動いている人は普通にプロジェクトの設定画面でjarを
指定しているだけなんでしょうか?
だとしたらこちらの環境か設定の問題と切り分けられるんですが・・・。
scalaは外部にあるものを使っていて、SCALA_HOMEとPATHは設定済みです。

242:デフォルトの名無しさん
09/09/10 13:42:01
>241
夕食に納豆食べれば解決策がひらめくらしいよ。

243:デフォルトの名無しさん
09/09/10 22:23:18


244:デフォルトの名無しさん
09/09/10 22:56:52
なんか書けよ

245:デフォルトの名無しさん
09/09/10 23:42:50
NetBeansのプラグインを使った環境で・・・
ちゃんと動いている人は普通に・・・


246:デフォルトの名無しさん
09/09/11 00:23:25
うーむ動かすことができるのか・・・。
うらやましい。NetBeansもScalaもクリーンインストールだし、
もはやなんの対策も思いつかない。

247:デフォルトの名無しさん
09/09/11 00:37:51
プラグインをインストールできないといいたいのか、
自作JARを外部参照するプログラムをコンパイルできないといいたいのか、
よく分からない質問だ


248:デフォルトの名無しさん
09/09/11 00:51:57
JARを外部参照するプログラムを、
コンパイルはできるけども、なぜか型の情報が出てこない。
全ての型情報が<error>になる。コード補完もめちゃくちゃ。
import文を消すと復元する。
プラグインは入る。jarは外からとってきた奴だけど、
javaプロジェクトでは普通に参照できるし、いろんなファイルで試しても同じ。
そんな感じです。

249:デフォルトの名無しさん
09/09/11 05:41:24
候補が表示されたりされなかったりするからバグッてると思う

250:デフォルトの名無しさん
09/09/11 10:23:33
URLリンク(wiki.netbeans.org)

251:デフォルトの名無しさん
09/09/11 19:19:18
Scala 2.7.6 final | The Scala Programming Language
URLリンク(www.scala-lang.org)

252:デフォルトの名無しさん
09/09/12 23:35:38
>>250
つ最終更新日時

つか、NetBeans 6.7.1のを使っているとかいう落ちでは?

253:デフォルトの名無しさん
09/09/15 18:33:38
>>252
当たりでした。6.7.1に、プラグイン6.7v1を入れ直したら、動きました。
お騒がせしました。

254:デフォルトの名無しさん
09/09/15 20:27:44
読みが当たったか

255:デフォルトの名無しさん
09/09/15 22:14:06
エスパーいくない

256:デフォルトの名無しさん
09/09/16 23:15:44
ひょっとして3項演算子ってない?

257:デフォルトの名無しさん
09/09/16 23:28:42
いらんと思うけど
val a = if (true) 1 else 2
こんなんでいいんでしょ?

258:デフォルトの名無しさん
09/09/16 23:37:40
ifが代わりになるから、要らないって言えば要らないけど
ちょっとだけ面倒と思ってしまっただけです
ifは1行でも中括弧付ける癖があるし

259:デフォルトの名無しさん
09/09/17 00:07:40
パーサーコンビネーター使ってるとき

def xxx:Parser[]って記述と
case classって記述はどうやって

使い分ければいいの?

260:デフォルトの名無しさん
09/09/17 00:11:04
使い分けはできない

261:デフォルトの名無しさん
09/09/17 00:11:38
>>260
じゃあ何のために2つ使うの?

262:デフォルトの名無しさん
09/09/17 01:39:01
>>261
じゃあ何のために使い分けたいの?

263:デフォルトの名無しさん
09/09/17 01:40:47
ScalaによるWebアプリケーションフレームワーク「Lift」とは
Scala+Liftによる実践Webアプリケーション開発(1)
URLリンク(codezine.jp)


264:デフォルトの名無しさん
09/09/17 01:47:36
>>259
基本的には>>260で終了だが、
不毛なやり取りが続いてるみたいだから、一応もうちょい説明すると
def xxx: Parser[T] ...
はParser[T]型を返すメソッドの宣言
case classはパターンマッチに使える新しい型の宣言
そもそも全く意味が違うので、使い分けるとか意味がわからんです。
つか、この二つの区別がつかないってパーザコンビネータ使うとか以前の
レベルで、クラスとかメソッドとは何?ってところから勉強し直した方がいい。

265:デフォルトの名無しさん
09/09/19 14:40:56
scala本、解説は丁寧でわかりやすいけど、演習問題が少なすぎる希ガス
理解はしても身についてる感が全くない

266:デフォルトの名無しさん
09/09/19 15:31:41
演習問題なんていちいちやったことないわw

267:デフォルトの名無しさん
09/09/19 15:44:34
ある程度身についたら、いきなりLiftとか使っちゃっていいんじゃないの

268:デフォルトの名無しさん
09/09/19 17:15:51
勉強では手を動かさず、いきなり実践訓練か。みんなすげぇなぁ。
俺もトライしてみるか。

269:デフォルトの名無しさん
09/09/19 18:31:05
使わないコードは極力書きたくないから演習問題なんてしない・・・

270:デフォルトの名無しさん
09/09/19 18:33:17
もっとパラダイムが面白い言語だったら演習もいいけどね、HaskellとかPrologとか
Scalaは実践向きでしょ

271:デフォルトの名無しさん
09/09/19 21:44:39
俺はScalaでproject-eulerやってる。
問題の性質上、関数型っぽい書き方になる。
あまり実用的じゃないけどね。

272:デフォルトの名無しさん
09/09/19 21:46:27
なんか実用的なScalaプログラミング教えてよ

お前ら頭いいしなんでも知ってるだろ?

273:デフォルトの名無しさん
09/09/19 22:48:04
普通にjavaみたいなコードを書けばいいだけなんじゃ。。

274:デフォルトの名無しさん
09/09/20 00:43:03
>>270
パラダイムだったらOCamlあたりに引けをとらない面白さだけどな
Haskellより進んだ機能も多いし
確かにPrologのような斬新さはないが

275:デフォルトの名無しさん
09/09/20 01:22:59
Programming in scalaは
project-eulerで練習するような変態向けじゃなくて一般向け書籍だろ。
なら、特徴的な言語機能毎に練習問題があった方が本の目的には合ってると思うがな。

276:デフォルトの名無しさん
09/09/20 01:26:11
liftのgetting startedっていまいちだよね

277:デフォルトの名無しさん
09/09/20 01:39:39
>>274
OOとの融合や暗黙型変換を除いてどのあたり?

278:デフォルトの名無しさん
09/09/20 22:09:28
XML埋め込めるってのはあるな

279:デフォルトの名無しさん
09/09/20 23:14:02
JavaScriptのE4Xより先?

280:デフォルトの名無しさん
09/09/20 23:51:08
少なくともHaskellよりは先

281:デフォルトの名無しさん
09/09/21 02:58:06
Scalaは実用言語なんだから、オンリーワンな新機能より、
メジャー言語では取り入れられてない程度の物を
うまく使いやすくまとめ上げるところに意味があるんじゃないか

282:デフォルトの名無しさん
09/09/21 03:59:47
普通に暗黙の型変換とかオンリーワンな新機能じゃね?

283:デフォルトの名無しさん
09/09/21 17:24:50
暗黙型変換は、うまくまとめ上げるために無理矢理突っ込んだ感があるなぁ。
アドホックでプリプロセッサ的な強引さが、あまり美しいとは思えない。
キャストのオーバーロードは元からあるし、そこまでなら素直だと思うんだけど。

284:デフォルトの名無しさん
09/09/21 17:29:17
暗黙型変換なんて厨仕様もいいとこだろw

285:デフォルトの名無しさん
09/09/21 18:46:02
暗黙の型変換がどうプリブロセッサ的なのかさっぱりわからん

286:デフォルトの名無しさん
09/09/21 19:18:15
アドホックじゃないでしょ?Javaでアドホック仕様だった部分を一般化したらついでに強力な何かがついてきただけじゃん?

287:デフォルトの名無しさん
09/09/21 19:26:14
アドホックじゃないでしょ?Javaでアドホック仕様だった部分を一般化したらついでに強力な何かがついてきただけじゃん?

288:デフォルトの名無しさん
09/09/21 19:30:52
アドホックじゃないでしょ?Javaでアドホック仕様だった部分を一般化したらついでに強力な何かがついてきただけじゃん?

289:デフォルトの名無しさん
09/09/21 22:34:18
>>265
そもそも演習問題なんかあった?

290:デフォルトの名無しさん
09/09/22 01:22:22
0個あったんじゃね?
演習問題の個数は負値をとれないから、
0個を少ないと言わなければ、少ない物はなくなる

291:デフォルトの名無しさん
09/09/22 01:37:42
いずれ、
「暗黙の型変換もない言語ってダサいよなw」
みたいに言われる日が来るだろうな
Haskellが他の言語に対して
「型推論もない言語ってダサいよなw」
みたいに言ってたように

292:デフォルトの名無しさん
09/09/22 01:42:19
型変換についてよりリッチな方法は出てくるかもしれないけど、それは
もう少しパワーを落として安全かつ洗練された物になるんじゃ無かろうか。

293:デフォルトの名無しさん
09/09/22 01:44:38
暗黙の型変換?
ああ、Lispのマクロより非力な劣化版のことね

294:デフォルトの名無しさん
09/09/22 02:19:47
つか、暗黙の型変換って昔からなかった?

295:デフォルトの名無しさん
09/09/22 02:35:14
Scalaの場合は自分が作った新しい型へ、既存の型を変換するっていう仕組み
これは今までなかった
Lispのマクロとか、別の機能で同等の機能を実現できるというものを除けばね

296:デフォルトの名無しさん
09/09/22 03:24:05
Scalaの型推論って、何か弱くね?

297:デフォルトの名無しさん
09/09/22 03:28:14
Lispよく知らないんだけど、マクロでどうやるの?
関数じゃなくて、値側もしくは関数適用全般を乗っ取る必要があると思うんだが。
マクロにニセ関数的な形をイメージしてるのが間違い?関数適用全般自体を置き換えちゃうの?

あと、新しいのは暗黙ってとこだろ。型変換自体は単なる関数な訳で。
で、自明な場合以外に暗黙にやるのは怖いってのが一般常識だったんではないか?

298:デフォルトの名無しさん
09/09/22 03:39:06
Lispは関数が値として扱えるので、簡単に乗っ取ることができるよ
値を変えたり、対比したりする感覚で簡単にね
暗黙の型変換のようなことをやるには、引数を判別するだけ

299:デフォルトの名無しさん
09/09/22 03:43:28
いや、特定の関数にトラップを掛けるのは想像がつくけど、
暗黙型変換自体はすべての関数の適用に有効だろ?
そう言うのをどうするのかなと。

300:デフォルトの名無しさん
09/09/22 03:51:07
全ての関数適用に有効なわけないだろ
Scalaは変換先の型を引数にとる演算子とか、そこに属するメソッドに
対してのみ変換を行えるわけだから
その分にだけトラップをかければいいことになる

301:デフォルトの名無しさん
09/09/22 03:52:34
>>299
好きなものを選びな。
・関数定義を乗っ取る。
・構文解析を乗っ取る。
・評価器を乗っ取る。

302:デフォルトの名無しさん
09/09/22 04:12:49
>>300
>その分にだけトラップをかければいい
その通りだけど、「その分」ってのは静的に決まらないだろ。

>>301
それもマクロっていうの?

303:デフォルトの名無しさん
09/09/22 08:20:54
暗黙の型変換ってそれが有効な範囲をスコープで制御出来る所がイイね このアイディアはscalaオリジナル?


304:デフォルトの名無しさん
09/09/22 08:41:48
>>302
マクロだけどなんで?

305:デフォルトの名無しさん
09/09/22 10:19:24
>>302
いや、静的に決まるけど?

306:デフォルトの名無しさん
09/09/22 11:35:30
まあ実例を出したほうが説得力があるだろうね。

307:デフォルトの名無しさん
09/09/22 11:40:12
>>300 >>301
実例をどうぞ

308:デフォルトの名無しさん
09/09/22 11:45:59
暗黙の型変換のせいで、クラスのドキュメントが超見づらい。

309:デフォルトの名無しさん
09/09/22 11:51:07
暗黙の型変換は悪魔だな
なんでこんな仕様入れてるんだろ

開発者はアホだよな

310:デフォルトの名無しさん
09/09/22 11:52:30
Scalaの標準ライブラリってそんなに暗黙の型変換使ってたっけ?

311:デフォルトの名無しさん
09/09/22 11:53:50
暗黙の型変換を受け入れるscala信者もアホだよな

312:デフォルトの名無しさん
09/09/22 12:08:48
プリプロセッサとかLispのマクロとかなんでそういう的外れなたとえが多いのだろうか
新技術を無闇に恐れているというのは伝わってくるが

313:デフォルトの名無しさん
09/09/22 12:17:56
暗黙の型変換は危険だろ
言語関係の学会でも笑い話にしかならいのに

314:デフォルトの名無しさん
09/09/22 12:23:40
>>313
学会ってひどい煽りだな
なんでそこまでScalaに粘着してるの?

315:デフォルトの名無しさん
09/09/22 12:34:22
そもそもこれ実践で使ってる奴いんの?

316:デフォルトの名無しさん
09/09/22 12:42:59
何をそんなにがんばってるのー。

317:デフォルトの名無しさん
09/09/22 12:46:56
>>307
すまない、「その分」の実例は用意出来ない

318:デフォルトの名無しさん
09/09/22 12:49:44
Scalaの作者ってプログラミング言語の研究者だなw

319:デフォルトの名無しさん
09/09/22 12:51:22
>310
Liftで結構使ってる。

320:デフォルトの名無しさん
09/09/22 12:52:34
>>315
Liftのソースでimplicitをgrepしたら184個ひっかかった

321:デフォルトの名無しさん
09/09/22 12:56:07
分母を何にするか決まらないと何の比較にもならんよ。

322:デフォルトの名無しさん
09/09/22 12:57:22
それはそうと暗黙の型変換をマクロでやるのってイメージわかないので説明してほしいんだけど、
素人考えで思うのはマクロってシンタクスレベルの情報を使ってやるものだから
まだコンパイラが認識するようなレベルでの型の情報は取りだせないよね?
Lispのマクロだと(例えばCamlp4とかとは)その辺違うの?

323:デフォルトの名無しさん
09/09/22 12:59:15
Lispに静的型なんてあったっけ?

324:デフォルトの名無しさん
09/09/22 12:59:16
scala最悪だな

325:デフォルトの名無しさん
09/09/22 13:02:09
暗黙型変換があるから、
a.multiply(b).add(c)とかかかずに、a * b + cとわかりやすくかけるんだろ

326:デフォルトの名無しさん
09/09/22 13:03:14
>>325
言ってることがよくわかんない

327:デフォルトの名無しさん
09/09/22 13:13:17
>>326
これがわからなければ暗黙の型変換について何も
わかってないことになる
Scalaの本の最初のほうに書いてあるよ

328:デフォルトの名無しさん
09/09/22 13:16:11
それって演算子のオーバーロードの話では。。


329:デフォルトの名無しさん
09/09/22 13:25:36
この例だけ見ればそれと同じ働きをするというだけのこと

330:デフォルトの名無しさん
09/09/22 13:29:39
>>327
Scala本は手元にあるけど何を言ってるのかわからない
どの辺が暗黙の型変換関係あるわけ?
その式じゃ型が書いてないからわからん

331:デフォルトの名無しさん
09/09/22 13:33:07
>>328-330
済まない。出直して来る。

332:デフォルトの名無しさん
09/09/22 13:35:36
27ページと28ページ、それから398ページを呼んでもわからなければ死んでください

333:デフォルトの名無しさん
09/09/22 13:42:49
>>332
読んでもわかんないんだけど、
multiply と書こうが * と書こうが同じことでしょ?
そこに型変換関係あるの?

334:デフォルトの名無しさん
09/09/22 13:59:37
┐(´д`)┌ヤレヤレ

335:デフォルトの名無しさん
09/09/22 14:22:11
なんか急に頭の悪いレスが増えたな
学会がどうとか死んでくださいとか
大して難解な言語じゃないのに知ったかする奴も多くなったし
まあそれだけメジャーになったということかね

336:デフォルトの名無しさん
09/09/22 15:31:09
でも、最新(っぽい)技術で俺SUGEEしてる奴は三流だよw
C++とかの時代にいっぱいいたw 一言で言うと中二病。

337:デフォルトの名無しさん
09/09/22 16:18:39
>>304
では、Unkoburiburi型から、Int型への暗黙の型変換に相当する事を、
お前の言うlispのマクロで関数側にトラップを掛ける方法で実現したい場合、
トラップを掛ける必要がある関数の範囲は?

引数にIntをとる関数すべてにトラップが必要じゃないの?
そんなの毎秒毎秒新しく生まれてるでしょ?
コンパイル時点でトラップが必要な範囲の関数すべてをカバーするのは原理的に無理。

闇雲にLispスゲーって言っとけばいいってもんじゃないんだよ。

338:デフォルトの名無しさん
09/09/22 16:29:50
URLリンク(blog.objectmentor.com)
これってアリクイ?

339:デフォルトの名無しさん
09/09/22 16:55:37
>>323
Commonだと宣言型で (declare (fixnum x)) とか効率化やエラーチェックのために宣言する事はできる。
>>322
304じゃないけど、推察のとおりマクロ展開時には型情報とかは利用できないのが普通。
元Lisp使いの俺が想像すると↓みたいになるんじゃないかな。
1.Unkoburiburi型からInt型への変換を定義しておく
=> Unkoburiburi型からintへの変換はunkoburiburi-to-intとか
2.関数と引数の型もマクロ展開時に利用できるように用意しておく
=> (succ ([Int型 引数x]) ... ) とか
3.マクロ展開時に使えるように変数unkoの型を宣言する構文をつくる
=> (define test ([Unkoburiburi型 引数x]) ...) とか
とすることでマクロ展開時に型を照合して変換とかで実現かなぁ。
でも、型推論とか暗黙の変換も自作しなきゃいけないし、個人的にはスルーしていい話だと思うよ。
Camlp4は知らないが、プリプロセッサだとすると1. 2. の情報を展開時に利用するのがだるいかもしれない。

340:デフォルトの名無しさん
09/09/22 22:22:39
>>338
マレーバクです。

マレーバク
URLリンク(ja.wikipedia.org)

341:デフォルトの名無しさん
09/09/22 23:47:19
暗黙の型変換がダメっていうのは、AOPがだめっていっていた風潮ににているな。
どこに何がはいってくるのかが分からない・・・っていう。でも、AOPも使いどころさえ間違わなければ、みんなありがたく使ってるでしょ?それと同じじゃない?

342:デフォルトの名無しさん
09/09/23 00:04:54
>>341
AOPは最適化、マルチスレッド化の邪魔
意味無い

343:デフォルトの名無しさん
09/09/23 00:06:32
まだ作られて間もない概念だから、みんなどんな時にありがたいのかが
わかってなくて、別の似た古い概念のイメージで
批判してるだけだと思う

344:デフォルトの名無しさん
09/09/23 00:07:45
このスレに関して言えば、一人の粘着が執拗に叩いてるだけだと思う

345:デフォルトの名無しさん
09/09/23 00:13:48
そもそも、全員が全員賛成するようなことじゃないだろ。
一般的に言って、メリットデメリットを言うのはいいが、
メリットしか言わないでマンセーしてる奴はカルトだよw

346:デフォルトの名無しさん
09/09/23 00:15:39
今はその以前の段階だろう
なんかわからんうちから先入観で批判してる印象

347:デフォルトの名無しさん
09/09/23 00:21:28
新しいものは何でも批判して旧弊に固執するような人が居るからこそ、
新しいものを学ぶ人間に儲けの目が出てくる。

頭が悪い人を見て批判するより、そこから儲けを出すほうが賢いと思う。

348:デフォルトの名無しさん
09/09/23 00:22:22
暗黙の型変換はAOPほど恐れる必要はない
スコープで制限されてるから暴発しづらいし、既存のメソッドの上書きなんかもできない
既存のクラスにメソッドを足すか、明示的に変換しなきゃいけないところを省略できるだけ

ただ、importは慎重にやらないといけなくなる
importすることで暗黙の型変換のメソッドも動くようになるから
importする前にどんなimplicit関数があるかチェックする必要がある

349:デフォルトの名無しさん
09/09/23 00:25:57
なんでexplicit見たいに暗黙の型を
禁止するキーワード無いの?バカなの?

350:デフォルトの名無しさん
09/09/23 00:31:07
>>349
そんなものを追加しても誰も使わないのでは?

351:デフォルトの名無しさん
09/09/23 00:34:34
こうゆう危険な機能があると流行らないね
C++も危険な機能満載だったから流行らなかったし


352:デフォルトの名無しさん
09/09/23 00:35:18
非明示的な型変換はケースによって必要ではあるし、変換規則を言語仕様に組み込んだ言語もいくつかあるが
プログラマにとって予想外の挙動がトラブルの元凶にもなっていた
そこで変換規則のスコープを制限すれば適度に使いやすくなるだろうと・・・・・?

発想は分かるが、うまくいくかはよく分からん
他言語での実験例はあるんだろうか?

353:デフォルトの名無しさん
09/09/23 00:36:35
>>352
言語オタの基地外しか思いつかないと思う



354:デフォルトの名無しさん
09/09/23 00:37:11
>>352
いくつもあるって、たとえばどんな言語?

355:デフォルトの名無しさん
09/09/23 00:39:23
そもそも暗黙の型変換で実現された機能がScala自身にたくさんあるという事実と、
Liftに大量に存在するという事実から、客観的にもう結論は出てるようなもんだと思う

356:デフォルトの名無しさん
09/09/23 00:40:26
結論解ってるやつ以外使えない
解りたければソースを読め

357:デフォルトの名無しさん
09/09/23 00:40:30
>>351
普通にScalaがC++以上に流行ることはないと思うけど?

358:デフォルトの名無しさん
09/09/23 00:41:42
>>356
解っているやつ以外使えないって当たり前だろ
むしろ解ってないやつは使うなよ

359:デフォルトの名無しさん
09/09/23 00:42:21
URLリンク(stackoverflow.com)
ケースクラスの場合?

360:デフォルトの名無しさん
09/09/23 00:43:27
C++が流行らなかったって・・・
さすがにそこまで無知なのはどうかと

361:デフォルトの名無しさん
09/09/23 00:48:47
>>351
またお前か・・・

362:デフォルトの名無しさん
09/09/23 00:49:41
>>359
ケースクラスじゃなくてもできると思うけど
Scala本に書いてある範疇
パターンマッチング推奨で、asInstanceOfはわざと長くしてるらしい

363:デフォルトの名無しさん
09/09/23 01:20:13
まじキチ…ユダヤが人工地震を起こすぞ

【緊急情報カクサンよろしく】

ついに来ました。

大きい動きです。250nT超えてきました。ほぼ間違いありません。もう一度言います。

友人、知人、親類縁者、あらゆるつながりを駆使して巨大地震がくることを教えて下さい。

四川地震より大きいのが来る可能性があります。
URLリンク(g)<)★253494015/
【大気イオン】e-PISCO Part11【また延長】
スレリンク(eq板)★252991726/

本当に地震が来たら、犯人は特権階級全員だということ2


364:デフォルトの名無しさん
09/09/23 21:46:53
イミュータブルでいつも同じ値を返す無引数メソッドは、valにすべきではない/defとすべき、なの?
Scala本に、
 def tail = new Queue(いつも同じ値,いつも同じ値2)
みたいのが載ってて、Queueはイミュータブルなクラスなんだけど、これは
 val tail = new Queue(いつも同じ値,いつも同じ値2)
の方がいいじゃん、て思ったんだけどなんでdefなの?

365:デフォルトの名無しさん
09/09/23 22:10:43
>>364
tail変数に別のQueueを代入したかったからじゃない?

366:デフォルトの名無しさん
09/09/23 22:14:10
>>364
valだとオブジェクト生成時点で評価されちゃう。tail欲しくないのに必ず
new Queue(いつも同じ値, いつも同じ値2)
とされちゃうのは嫌だよね。計算コストが無視できるくらい小さいならそれでも良いかもしれんけど。
lazy valなら最初にアクセスされた1回だけで済むから、lazy valにするなら良いと思うけど。

367:デフォルトの名無しさん
09/09/23 22:25:46
なるほど、そういうことか、サンキュー

368:デフォルトの名無しさん
09/09/24 00:01:20
ということは、valよりdefがよいという一般慣習ではないって事ね。
このtailは同一オブジェクトに対してあまり何度も呼ばれなさそうだというだけで、
ほぼ必ず呼ばれてかつ大量な回数呼ばれそうな場合はvalにして問題ないって事ね。

ちなみに、lazy valでないのは、単に本の構成上(このコードはlazyの説明より前に載ってた)の問題と思ってよい?

369:デフォルトの名無しさん
09/09/24 02:17:04
valをdefでoverrideとか出来るよね、確か。

valかdefかは効率の問題って感じ?

370:デフォルトの名無しさん
09/09/24 07:47:43
overrideできる時点でvalであってもバイトコード上ではinvokevirtual使っているのかも。
そうなると、評価にかかるオーバーヘッドも差はないのだろうな。
あとは、値の束縛タイミングで使い分ければいい感じかな・・・?

371:デフォルトの名無しさん
09/09/24 11:05:53
valもdefも同じシンボルテーブルで管理されるらしいから相互にオーバーライド可能。

scalaでは値(シンボルテーブルとしてはフィールド、メソッド、パッケージ、シングルトンオブジェクト)と型(クラス、トレイト)の2種類しかないって本に書いてあったですよ。

372:デフォルトの名無しさん
09/09/24 11:30:37
val は変数を定義式の値に設定
def は変数を定義式自体に設定
tail の場合、def だと参照するたびにコンストラクタが評価されることになるはず
つまり、初期化引数は同じでも生成されるオブジェクト自体は別物になる

373:デフォルトの名無しさん
09/09/24 16:12:36
valで定義すると、変数自体が外から見えるように思えるけど、
実際は、変数を返すだけのgettterが自動で生成されてる。
関数呼び出しコストはvalでも掛かる。

>>372
値が同じイミュータブルなオブジェクトを、呼ばれるたびに毎回作る意味は?

374:デフォルトの名無しさん
09/09/24 19:20:04
>373
valがgettter経由なのは、そのクラス内から参照した時もそうなの?
privateだと違うのかな?

375:デフォルトの名無しさん
09/09/24 19:28:43
試してみればいいんじゃないの。オーバーライドして違いを観察できるっしょ。

376:デフォルトの名無しさん
09/09/24 20:58:03
>>373
基本的にはそうだけど、private[this]なvalやvarはgetter/setter生成する必要が無いので、
内部的には直接フィールド参照するコードが生成されてる。

377:372
09/09/24 23:07:45
>>373
ミュータブル版の Queue を使うときにもプログラムを書き換えずに済むから?
正確な「意味」は当のプログラム自体を見ないと答えようがないけど (ちなみに私は Scala 本未購入)

378:デフォルトの名無しさん
09/09/24 23:41:24
>>377
手元のScala本のコード確認してみたけど、関数型言語では一般的な、(immutableな)ListのペアでQueueを表現
するやつだな。日本語版(p.352)から関係のある箇所だけ抜粋するとこんな感じ。tailから呼ばれるmirrorはtrailingの
長さによっては、コストがかかり得るので、valでなくdefにするのは理にかなってる。lazy valだともっと良いけど。

class Queue[T] (
 private val leading: List[T],
 private val trailing: List[T]
) {
 private def mirror =
  if (leading.isEmpty)
   new Queue(trailing.reverse, Nil)
  else
   this
 ....
 def tail = {
  val q = mirror
  new Queue(q.leading.tail, q.trailing)
 }
 ...
}

379:デフォルトの名無しさん
09/09/25 00:32:43
イミュータブルなデータからの部分範囲の取得は常に新しいオブジェクトとして生成されるべき
だから、この tail は引数なしのメソッドです、フィールドではなくて

380:デフォルトの名無しさん
09/09/25 00:42:03
>379
何でそうなるべきなのか、理由を書いてくれ。

381:デフォルトの名無しさん
09/09/25 04:11:35
abstract typeってなんでこんなのあるの?一度上位型扱いされたら使えなくならない?

abstract class 親型 {type Hoge; def fuga(Hoge)}
class 子型 extends 親型 {type Hoge=Foo; def fuga(Hoge){}}
として、
new 子型 fuga new Foo
は動く(コンパイル通る)けど、
val a:親型 = new 子型
a fuga new Foo
は駄目。わざわざ危険なキャストが必要になる。
a fuga (new Foo).asInstanceOf[a.Hoge]

こんなの、ちゃんと安全な型パラメタがあるんだから要らないじゃん?とか思うんだけど。

382:デフォルトの名無しさん
09/09/25 09:45:57
>>202
亀レスだが、val/immutable、var/mutableの絶対的な量を問題にするよりも、
val/immutableでいいところが、var/mutableになってないかという視点で、
クラスライブラリのソース見るといいと思う。
出来ないものをval/immutableにしようとしても、
それは無理な相談なのだから。

383:デフォルトの名無しさん
09/09/25 09:46:06
イミュータブルなときにdefとvalのどっちを使うかについては、
Scala本にはフィールドはメソッドに比べて速度が速いけどメモリを食うと書いてあるな
結局getter経由なのにフィールドの方が速いのだろうか

384:デフォルトの名無しさん
09/09/25 10:26:51
>>379-380
>イミュータブルなデータからの部分範囲の取得は常に新しいオブジェクトとして生成されるべき

べきっていうかそれしか不可能でしょ。理由はimmutableだから。

385:デフォルトの名無しさん
09/09/25 17:25:20
>>381
それは使い方間違っとるがな。正しくはこう。

class Foo
abstract class 親型 { type Hoge; def fuga(hoge: Hoge) }
class 子型 extends 親型 { type Hoge = Foo; def fuga(hoge: Hoge){} }
val a: 親型 { type Hoge = Foo } = new 子型 // { type Hoge = Foo }の部分が必要
a fuga new Foo// コンパイル通る

というのはともかく、理論的にはabstract typeはGenericsと機能的には少なくとも同等(のはず)。
ただ、多数の型パラメータ引き連れてる型を継承したいとか、型パラメータを介して複数の型が相互依存関係にある場合とか、
型パラメータの一部だけインスタンス化して他のはabstractなままにしときたいとか、abstract typeの方が便利なことも
ときどきある。たとえば、パーザコンビネータライブラリのParsersでもabstract typeが使われてるね。これは、型パラメータが
あちこちに引き回されることを考慮してのことだと思う。

386:デフォルトの名無しさん
09/09/25 17:28:28
>>383
valは値を再計算しないけど、defは呼ばれるたびに本体評価するんだから、valの方が通常は
速いのはある意味当たり前かと(呼ばれる場合の話ね。defはメソッドだから実際に呼ばれるまで
評価されないので)。

387:デフォルトの名無しさん
09/09/25 21:05:19
>>384
キャッシュがあったらミュータブルじゃんて言いたいの?
外部から見えなくても?というか、遅延初期化もミュータブル?
つうか、空間効率無視すれば、初期化を遅延させなくてキャッシュもなしでイミュータブルな部分範囲に固定オブジェクトを返すのは可能でしょ。

388:デフォルトの名無しさん
09/09/25 21:13:08
補足
>初期化を遅延させなくてキャッシュもなしでイミュータブルな部分範囲に固定オブジェクトを返すのは可能でしょ。
遅延させずに、初期化時に、必要な部分範囲オブジェクトを全部作っちゃうことを言ってる。



389:デフォルトの名無しさん
09/09/25 22:52:52
>>385
// { type Hoge = Foo }の部分が必要
おおなるほど。って、これ型パラメタそのまんまやん。
カギ括弧が嫌いな人以外にどううれしいのかよくわからんけど、普通はあんま気にしなくていいのかな。
Parsers使う機会があった時に感じられれば。

390:デフォルトの名無しさん
09/09/27 23:47:13
scalaのparser combinatorで

長さが1から8のdigitだけをacceptするような
定義を記述する場合

repN(8,digit)って感じで書けばいいのですか?

391:デフォルトの名無しさん
09/09/29 00:55:22
(x :: y) mkString ""

の””って何しているのでしょうか?

392:デフォルトの名無しさん
09/09/29 01:09:57
>>391
セパレータを指定してる。mkStringメソッドは、コレクションの各要素について
最初の要素.toString + セパレータ + 次の要素.toString + セパレータ ....
みたいな文字列を返すので、""を指定すると、単にコレクションの全要素をtoStringしたのを
つなぎあわせたのが返ってくる。

393:デフォルトの名無しさん
09/09/29 01:54:16
わかりました。ありがとうございました。

394:デフォルトの名無しさん
09/09/29 09:46:29
>>357
C++だと、templete、一引数コンストラクタ、ADLで、
暗黙の型変換が可能。典型的なのが_1 + _2。

395:デフォルトの名無しさん
09/09/29 20:21:19
scala のコレクション、ミュータブル系の操作が += とかで紛らわしいな。

396:デフォルトの名無しさん
09/09/29 20:23:41
そう思うなら使わなくていいんだよ

397:デフォルトの名無しさん
09/09/29 21:26:54
実際万人向けじゃないなと思った
なんかBoostを思い出す

398:デフォルトの名無しさん
09/09/29 21:52:45
万人向けじゃないってどこを指してるのかわからんけど、
他の言語もScalaみたいになっていくと思うよ

399:デフォルトの名無しさん
09/09/30 01:46:10
2445.544Dを解析すろとき

=>の続きってどうやってかけばいいのでしょうか
全部繋げたStringにしたいのですが

def test = rep(digit) ~ '.' ~ rep(digit) ~ 'D' ^^ {
case a ~ b ~ c ~ d => 
}

a::: b :: c ::dじゃエラーになる難しい

400:デフォルトの名無しさん
09/09/30 22:57:03
List(5,4)とSome(A)を合成して

List(5,4,A)を作るにはどうすればいいのですか?

401:デフォルトの名無しさん
09/09/30 23:27:02
そのAっていう値の型は何よ。

402:デフォルトの名無しさん
09/10/01 00:32:40
>>364
携帯から浅はかな考えがらレスするが、
QueueがQueueを返すvalを定義すると場合によっちゃ無限ループじゃね?
最も、既存ライブラリがそんなバカな作りしてるわけないだろうけど
自身が自身の型をvalで定義するのはマズそうってのが俺なりのイディオム

403:デフォルトの名無しさん
09/10/01 00:45:48
>>399
def test = rep(digit) ~ '.' ~ rep(digit) ~ 'D' ^^ {
 case a ~ b ~ c ~ d => a.mkString + b + c.mkString + d
}
とかでどうよ。

404:デフォルトの名無しさん
09/10/01 00:54:57
>>400
Aが何型かようわからんが、とりあえず
Some(A)
が型Option[A]の変数sに入ってるとして、
scala> List(5, 4) ::: (s match { case Some(a) => List(a) case None => Nil })
res4: List[Any] = List(5, 4, A)

405:デフォルトの名無しさん
09/10/01 01:35:29
>>402
この場合(っていうか通常)は、無限って事はなくて要素すべての分だけ作られちゃうわな。
でもそのためにlazyってあるんじゃなくて?
lazyってあんま使っちゃいかん物?

406:デフォルトの名無しさん
09/10/01 14:52:17
>>405
>lazyってあんま使っちゃいかん物?
んなこたーない。がんがん使っておけ。生成されたコード見てみればわかるけど、オーバーヘッドもさほど
大きくないし。

407:デフォルトの名無しさん
09/10/03 19:49:50
ちょっとParser Combinatorの書き方が解らないので助けてください。

def test = '\'' ~ rep(digit) | '\'' ^^ { case a ~ b ~ c => a + b.mkString + c}

この結果が > 4のとき成功するという長さを判別するにはどうしたらいいのでしょうか?

'1234'はOKで
'1'はNGにしたいです

408:デフォルトの名無しさん
09/10/04 03:23:33
レシーバの暗黙型変換っつうか新しいオブジェクトを作る暗黙型変換て、
最内ループで使われてると知らぬ間に無駄に大量のオブジェクト作って遅くなりそう。
new自体はまだよくてもGCコストが上がりそう。

>>407 知らないで適当に言うけど、パーサーひとつのみ引数に撮るrepじゃなくて、
ほかに回数指定できるコンビネーターがあるでしょ、多分。

409:デフォルトの名無しさん
09/10/04 03:28:49
マニュアル読め。
URLリンク(www.scala-lang.org)

410:デフォルトの名無しさん
09/10/04 12:26:59
repN(4,digit) ~ rep(digit) で良いんじゃない?

411:デフォルトの名無しさん
09/10/04 12:28:03
>>407
repN使うべし。>>409も書いてるけど、ライブラリの使い方でわからんとこあったら、
まずAPIドキュメント読むくせつけた方がいいよ。

412:デフォルトの名無しさん
09/10/04 12:29:15
うお。>>410とちょうどかぶった。

413:デフォルトの名無しさん
09/10/04 20:18:00
なんでJavaTokenParsersって

"test" ~ "test2"みたいな記述ができるの?

StdLexicalだとエラーになるのに

414:デフォルトの名無しさん
09/10/04 21:26:26
ちゃんとAPIドキュメントは調べたん?すでに複数人に指摘されているようだが。
URLリンク(www.scala-lang.org)

暗黙の型変換(implicit)を知らんのだったら、ちゃんと調べておかないとこの先もはまりまくりかと。

415:デフォルトの名無しさん
09/10/04 21:56:17
>>414
ということは、scalaを使う場合全部ソースコード
実装を把握しないと使えないと考えたほうがいいのでしょうか?



416:デフォルトの名無しさん
09/10/04 21:58:54
なんでAPIドキュメントが実装を把握するうちに入るんだ。

417:デフォルトの名無しさん
09/10/04 22:07:35
>>415
APIドキュメントは辞書だよ。判らない語彙に出くわしたら調べるのは当たり前。
ただし、Scalaには暗黙の型変換という、ソースに陽に現れない語彙があるので、
暗黙の型変換はちゃんと勉強しておくべき。

暗黙の型変換が罠っぽいという話は、このスレにも何度も出ている。

418:デフォルトの名無しさん
09/10/05 06:06:39
ドキュメントを読まない奴はプログラミングやめろ

419:デフォルトの名無しさん
09/10/05 22:21:22
どっちかつーとドキュメント書かない奴にやめてほしい

420:デフォルトの名無しさん
09/10/05 22:30:30
ドキュメントめんどくせーよ
ソース読む方が早い
だから綺麗に書け

421:デフォルトの名無しさん
09/10/06 02:41:44
綺麗なソースはドキュメントなくても読めるな
意図が分かる書き方されているのはすごく読み易い

きたなくてドキュメントないのが最悪



422:デフォルトの名無しさん
09/10/06 07:19:19
Liftって関数は何をしているの?


423:デフォルトの名無しさん
09/10/06 09:22:11
丸ごとの持ち上げ。

424:デフォルトの名無しさん
09/10/06 22:31:24
2.7.7 RC1

425:デフォルトの名無しさん
09/10/06 22:47:18
もう2.7系はバグフィックスだけでしょ?
2.8はいつ出るの?

426:デフォルトの名無しさん
09/10/07 09:48:22
scalaのWebフレームワーク Liftを使ったサイトはどんなのがありますか?
できればそれが載っている一覧とかが欲しいんですが。。。

427:デフォルトの名無しさん
09/10/07 11:49:15
URLリンク(groups.google.com)

前に探したときも見つからなかったな。
オフィシャルで利用サイトの情報整理してないのかもしれないね。

428:デフォルトの名無しさん
09/10/09 10:47:13
>>426
>>427
ビジネスSNSのLinkedInはScalaを使っているようだけど、
Liftを使っているのか!?



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