質問

ちょっとだけ見る Scala所蔵図書館の再実施 るが、差し迫った 2.8 リリース。その図書館から2.7者は図書館から利用の視点に変更します。たとえば---

> List("Paris", "London").map(_.length)
res0: List[Int] List(5, 6)

...たします。 図書館はeminently用:この幻想的です。しかし、それを知らないスカーラ、 魅くの言語 いい意味でのメソッドシグニチャーのように:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

のためのシンプルな機能は、このうちのひと署名をい自分を見つけるのに苦労する。 ないと思いScalaったが、次のJava (C/C++/C#)-いと思うからそのクリエイターを目指している市場だと思いましたものは確かに実現するためのスカラになり、次のRubyやPython(を得る重要な商業用ユーザー-ベース)

  • このうちをオフに来Scala?
  • ここだけにしか見られないScala悪の世界として 学術的な遊び道具がいっぱい ることのみに専用の博士課程の学生に説明していただけますか。は CTOsヘッドのソフトウェアを取得しては怖いですか?
  • した図書館の再デザインの顕うか?
  • 使用している場合は、Scalaの商業いもしています。いうことで、さまざまな企画が採用さ2.8すぐには見何が起きているのでしょうか。

Steve Yegge 一度に襲われScala (誤って私の意見えたとしてovercomplicatedタイプ-システム。少し心配していた人がたての広がり FUD このAPI(同様にどのようにジブロッホの恐怖 JCP 行の追加を閉鎖する

注意 - 私は明確であるべきであることもあると思い ジョシュア-ブロッホ した影響力のある、拒絶反応のBGGAの閉鎖を提案しない傾向が継続する以外のものは彼の率直に考え提案に代表される間違いです。


もう私の妻や仲間いろいろ教えてくれてるとは思いません僕はゲー:心としたテナントが入っていま度では,小学校算数において, オックスフォード大学, "って、グ市販のほとんどの12年間に Scala 約年も商業的に).

注の炎症対象タルエンタテインメントは、 見積もりについてのマニフェストのイギリス政党 1980年代初期.この問いは主観的ですが本物のうためのシェイプを作ってみましたのでCWていただきたいと思いますように意見をするものとする。

役に立ちましたか?

解決

「自殺メモ」ではないことを願っていますが、あなたの主張を見ることができます。あなたは、Scalaの強さと問題の両方を同時にヒットしました:その 拡張性. 。これにより、ライブラリにほとんどの主要な機能を実装できます。他のいくつかの言語では、ようなものとシーケンス map また collect 組み込まれ、コンパイラがスムーズに動作させるために通過しなければならないすべてのフープを見る必要はありません。 Scalaでは、それはすべて図書館にあり、したがって公開されています。

実際、の機能 map それはその複雑なタイプによってサポートされています。このことを考慮:

scala> import collection.immutable.BitSet
import collection.immutable.BitSet

scala> val bits = BitSet(1, 2, 3)
bits: scala.collection.immutable.BitSet = BitSet(1, 2, 3)

scala> val shifted = bits map { _ + 1 }
shifted: scala.collection.immutable.BitSet = BitSet(2, 3, 4)

scala> val displayed = bits map { _.toString + "!" }
displayed: scala.collection.immutable.Set[java.lang.String] = Set(1!, 2!, 3!)

常に最高のタイプを常に取得する方法をご覧ください。マッピングする場合 Ints to Intsもう一度取得します BitSet, 、しかし、あなたがマッピングする場合 Ints to StringS、あなたは将軍を得る Set. 。静的タイプとMAPの結果のランタイム表現の両方は、それに渡された関数の結果タイプに依存します。セットが空であっても機能するため、機能が適用されません!私の知る限り、同等の機能を備えた他のコレクションフレームワークはありません。しかし、ユーザーの観点からは、これは物事がどのようになっているかです 想定 働くために。

私たちが抱えている問題は、これを起こさせるすべての巧妙なテクノロジーが、大きくて怖くなるタイプの署名に漏れていることです。ただし、ユーザーはデフォルトで完全なタイプの署名を表示するべきではないかもしれません map?彼女が見上げたらどうですか mapBitSet 彼女は得た:

map(f: Int => Int): BitSet     (click here for more general type)

ユーザーの観点からは、マップにはタイプがあるため、ドキュメントはその場合にはありません。 (Int => Int) => BitSet. 。しかし map また、別のリンクをクリックして検査できるより一般的なタイプもあります。

このような機能はまだツールに実装していません。しかし、私たちはこれを行う必要があると信じています。人々を怖がらせないようにし、より有用な情報を提供するためです。そのようなツールを使用すると、スマートなフレームワークとライブラリが自殺メモにならないことを願っています。

他のヒント

私は博士号も、CSも数学も実際には他の分野でも、他の種類の学位を持っていません。 Scalaや他の同様の言語の経験はありません。リモートで比較可能なタイプシステムさえも経験していません。実際、私が単なる表面的な知識以上のものを持っている唯一の言語は、 もっている タイプシステムはPascalであり、その洗練されたタイプシステムでは正確に知られていません。 (それはそれですが します 他の言語にはほとんどありませんが、ここではそれは実際には関連性がありません。)私が知っている他の3つの言語は、基本的な、スモールトーク、ルビーであり、タイプシステムさえありません。

それでも、私はの署名をまったく理解するのにまったく問題ありません map 投稿した機能。それは私にはほぼ同じ署名のように見えます map 私が今まで見た他のすべての言語で。違いは、このバージョンがより一般的であることです。 HaskellよりもC ++ STLのように見えます。特に、議論が IterableLike, また、コンクリートのリターンタイプから離れて抽象化します。 なにか 結果値のコレクションのうち。はい、それは非常に複雑ですが、それは本当に一般的なプログラミングの一般的なパラダイムの表現にすぎません。

この場合、 map 実際にはありません 必要 コレクションはリストになるか、注文されているか、ソート可能であるか、そのようなものです。唯一のこと map 気になるのは、コレクションのすべての要素に次々とアクセスできることですが、順不同ではありません。そして、結果のコレクションが何であるかを知る必要はなく、それを構築する方法を知る必要があります。したがって、それがそのタイプの署名に必要なものです。

だから、ではなく

map :: (a → b) → [a] → [b]

これは従来のタイプの署名です map, 、コンクリートを必要としないように一般化されています List むしろだけです IterableLike データ構造

map :: (IterableLike i, IterableLike j) ⇒ (a → b) → i → j

その後、これはさらに一般化されます。 変換 ユーザーが望むデータ構造の結果:

map :: IterableLike i ⇒ (a → b) → i → ([b] → c) → c

構文は少しぎこちないことを認めますが、セマンティクスは同じです。基本的に、それは始まります

def map[B](f: (A) ⇒ B): List[B]

これは従来の署名です map. 。 (SCALAのオブジェクト指向の性質により、入力リストパラメーターが消滅する方法に注意してください。これは、シングルディスパッチOOシステムのすべてのメソッドが現在の暗黙の受信機パラメーターであるためです。)それから、コンクリートから一般化されました。 List より一般的な IterableLike

def map[B](f: (A) ⇒ B): IterableLike[B]

今、それはに置き換えられます IterableLike その関数を備えた結果コレクション 生成, 、まあ、本当に何でも。

def map[B, That](f: A ⇒ B)(implicit bf: CanBuildFrom[Repr, B, That]): That

そうではないと本当に信じています それ 理解しにくい。必要な知的ツールはいくつかあります。

  1. あなたは(大まかに)何を知る必要があります map は。あなたが与えた場合 それだけ メソッドの名前のないタイプの署名は、何が起こっているのかを把握するのがはるかに難しいと認めます。しかし、あなたはすでに 知るmap やるべきであり、そのタイプの署名が何であるかを知っているので、署名をすばやくスキャンして、「なぜこれを行うのか」のような異常に焦点を合わせることができます map 2つの機能を引数として取得します。
  2. 実際にできる必要があります 読んだ タイプの署名。しかし、以前にScalaを見たことがない場合でも、これは非常に簡単なはずです。なぜなら、それは本当に他の言語からすでに知っているタイプの構文の混合物であるため、VB.NETはパラメトリック多型に四角いブラケットを使用し、矢を使用して矢を使用して名前とタイプを分離するためのリターンタイプとコロンは、実際には標準です。
  3. 一般的なプログラミングとは何かを大まかに知る必要があります。 (そうではありません それ それは基本的にすべて名前で綴られているので、理解するのは難しいです。文字通り、一般的な方法でプログラミングするだけです)。

これら3つのいずれも、プロのプログラマーまたは趣味のプログラマーに深刻な頭痛を与えるべきではありません。 map 過去50年間に設計されたほぼすべての言語で標準機能であったため、異なる言語が異なる構文を持っているという事実は、HTMLとCSSを使用してWebサイトを設計した人にとっては明らかであり、リモートプログラミングに登録することはできません。聖ステパノフ教会の迷惑なC ++ファンボーイのない関連メーリングリストは、一般的なプログラミングの美徳を説明しています。

はい、Scala 繁雑。はい、Scalaには、Haskell、Miranda、Clean、Cycloneなどの言語に匹敵する言語に匹敵する人間に知られている最も洗練されたタイプシステムの1つがあります。しかし、複雑さがプログラミング言語の成功に対する議論であった場合、C ++はずっと前に死んでいたでしょう、そして私たちは皆、スキームを書くでしょう。 Scalaが成功しない可能性が非常に高い理由はたくさんありますが、プログラマーがキーボードの前に座る前に脳をオンにすることを気にすることができないという事実は、おそらく主要なものではないでしょう。

C ++でも同じこと:

template <template <class, class> class C,
          class T,
          class A,
          class T_return,
          class T_arg
              >
C<T_return, typename A::rebind<T_return>::other>
map(C<T, A> &c,T_return(*func)(T_arg) )
{
    C<T_return, typename A::rebind<T_return>::other> res;
    for ( C<T,A>::iterator it=c.begin() ; it != c.end(); it++ ){
        res.push_back(func(*it));
    }
    return res;
}

まあ、私はあなたの痛みを理解することができますが、率直に言って、あなたと私のような人々、またはほとんどのスタックオーバーフローユーザー - はルールではありません。

私が意味するのはそれです...ほとんどのプログラマーはそのタイプの署名を気にしません。 彼らは決して彼らを見ることはありません!彼らはドキュメントを読みません。

彼らがコードがどのように機能するかのいくつかの例を見て、コードが結果を生成する際にそれらを失敗させない限り 予想, 、彼らは決してドキュメントを見ません。それが失敗すると、彼らはドキュメントを見て、見ることを期待します 使用例 頂点で。

これらのことを念頭に置いて、私はそれを思います:

  1. そのタイプの署名に出くわした人(ほとんどの人のように)は、彼らがそれに対して事前に分散している場合、Scalaをockしないようにし、Scalaが好きならScalaの力の象徴と見なします。

  2. ドキュメントが強化されていない場合は、使用例を提供し、方法が何であるか、どのように使用するかを明確に説明する場合、Scalaの採用を少し損なう可能性があります。

  3. 長期的には、それは問題ではありません。あのスカラ できる そのようなことをすると、Scalaのライブラリがより強力で使用がより安全に書かれます。これらのライブラリとフレームワークは、強力なツールに誘惑されたプログラマーを引き付けます。

  4. シンプルさと直接性が好きなプログラマーは、PHPまたは同様の言語を引き続き使用します。

悲しいかな、Javaプログラマーは電動工具に非常に夢中になっているので、それに答える際に、私は主流のScalaの採用に対する私の期待を修正しました。 Scalaが主流の言語になることは間違いありません。 c-mainstreamではなく、おそらくperl-mainstreamまたはphp mainstreamです。

Javaといえば、クラスローダーを交換したことはありますか?それが何を含むかを調べたことがありますか?作家が行う場所を見ると、Javaは怖いことがあります。ほとんどの人がそうしていないということです。同じことがScala、Imhoにも当てはまりますが、初期の採用者は、そこに何かが隠れているかどうかを確認するために、遭遇する各岩の下を見る傾向があります。

これは人々がスカラに来るのを先送りにするつもりですか?

はい、しかし、それはまた、人々が先送りされるのを妨げます。 Scalaがより魅力的なタイプをサポートして以来、より魅力的なタイプを使用するために大きな弱点になるコレクションの不足を考えてきました。 APIドキュメントをより複雑にしますが、実際に使用がより自然になります。

これは、専用の博士課程の学生だけが理解できる学問的な遊びとして、商業世界でScalaに悪い名前を与えるのでしょうか? CTOとソフトウェアの長は怖くなるでしょうか?

おそらくいくつかはそうでしょう。 Scalaは多くの「専門的な」開発者がアクセスできるとは思わない。一部はScalaの複雑さのためであり、一部は多くの開発者が学びたくないためです。そのような開発者を雇用するCTOは、当然怖くなります。

図書館は賢明なアイデアを再設計しましたか?

絶対。コレクションは、残りの言語とタイプシステムに適しています。

Scalaを商業的に使用している場合、これについて心配していますか?すぐに2.8を採用するか、何が起こるかを見るのを待っていますか?

私はそれを商業的に使用していません。バグを洗い流すことができるように、少なくとも2.8.xシリーズに数回回転するまで待ってから、おそらくそれを導入しようとするまで待ちます。また、EPFLが開発プロセスを改善する上でEPFLがどれだけ成功しているかを確認するのを待ちます。私が見ているものは希望に満ちているように見えますが、私は保守的な会社で働いています。

「Scalaは主流の開発者にとっては複雑すぎますか?」のより一般的なトピックの1つです。

主流またはその他のほとんどの開発者は、既存のシステムを維持または拡張しています。これは、彼らが使用するもののほとんどがずっと前に行われた決定によって決定されることを意味します。 Cobolを書いている人はまだたくさんいます。

明日の主流の開発者は、今日構築されているアプリケーションの維持と拡張作業を行います。これらのアプリケーションの多くは、主流の開発者によって構築されていません。明日の主流の開発者は、今日で最も成功している新しいアプリケーションの開発者が使用している言語を使用します。

ScalaコミュニティがScalaに新しいプログラマーの恐怖を和らげるのに役立つ1つの方法は、練習に集中し、例で教えることです。このアプローチをとるサイトは次のとおりです。

これらのサイトでしばらく時間を費やした後、特に一般的な場合には、設計と実装が難しいものではありませんが、設計と実装が難しくないかもしれませんが、Scalaとそのライブラリはそれほど難しくないことにすぐに気付きます。

私は大学の学部卒業からの格安"にマスマーケット"米国の大学んからの指示に従うことが初めて作業bgm作ってみましたのユーザーの知性とともに、教育)規模:)私はツとスカラのためにほんの数ヶ月にしては非自明なアプリとなります。

特にその相互行ってい微IDEかぁのが現在のスカラーをスカーラの開発は比較的痛み:

  • 私が使用できますScalaとして、"Javaずにセミコロン"、つまり書いてい類似したコードにどんなJavaの利益から少し構文の簡潔さなどが得られた型を推論する.例外処理がんでのものがあれば便利です。クラス定義はるかにインパクトは小さいものの詳細なく、ゲッター/setter定型.

  • 一度になったという経験を通じて、一行書き込むの達成に相当する複数行のJava.利用できる場合に限り、チェーン機能の他の方法で地図を折って、収集、フィルター等楽しさを構成す優雅に見事です。

  • は稀にしかない自分を見つけらScalaの高い駆動の特徴:閉鎖の一部(クのcdやd)機能、パターンマッチング...そんなあるものです。

としてのピい違いにずっと悩み続けて、エッセイは英語で書や慣用句構文です。メソッドの呼び出しパラメータなしなの括弧の場合を除き、い;ケースの合算が必要な脂肪の矢 => ものができるところもありが必要になり薄膜の矢 -> ).多くの方法が短くいった名前を隠 /: または \: -取得できます私はもうすればフリップなマニュアルページが、一部の終了コードが見つからないようにPerlやノイズです。皮肉なことに、最も人気のビットの統語の短縮形は足りないアクション:今日の噛んだという Int な定義の設定 ++ 方法。

これは私の意見:のように感じScalaのC++の複雑さ、読みやC++.の統語的複雑さの言語のものAPIドキュメンテーション困難を読み込みます。

スカーラは非常に ったように思え でかなり多くの点.思多くの学者がプログラムです。しかし、これでものんびgotchasではより高い学習曲線上のJavaや難いという特徴があります。ればスキャンのフォーラムがどれほど多くの開発者がいることができなくなり、ここでは、Java、 できない発想のスカラが主流言語.な会社を説明することができるように送信する3週間のスカーラコースが旧いので日本人にはあまり合わないで1週間Javaコースです。

その方法の主な問題は (implicit bf : CanBuildFrom[Repr, B, That]) 説明なしで行きます。暗黙の議論がどのようなものかを知っていても、これがコールにどのように影響するかを示すものは何もありません。スカラドックを追いかけると、私はより混乱しているだけです(に関連するクラスのほとんど CanBuildFrom ドキュメントさえ持っています)。

私は単純な「範囲に暗黙のオブジェクトがなければならないと思います bf タイプのオブジェクトにビルダーを提供します B 返品タイプに That「やや役立つだろうが、本当にやりたいことがマップするだけで、それは一種の気まぐれな概念です A's to B's。実際、私はそれが正しいかどうかはわかりません。私はタイプがわからないので Repr 手段とドキュメント Traversable 確かに手がかりはまったくありません。

だから、私には2つのオプションが残っていますが、どちらも楽しいものではありません。

  • 古いマップの仕組みと他のほとんどの言語でマップの仕組みがどのように機能するかを単に動作させると仮定します
  • ソースコードをもう少し掘り下げます

Scalaは本質的に、これらのものがどのように機能するかについての内臓を明らかにしていること、そして最終的にこれがOxbow_Lakesが説明していることを行う方法を提供することを理解しています。しかし、それは署名の気晴らしです。

私はScalaの初心者であり、正直なところ、そのタイプの署名に問題はありません。パラメーターは、マッピングする関数と、正しいコレクションを返すためのビルダーの暗黙的なパラメーターです。明確で読みやすい。

実際、全体は非常にエレガントです。ビルダータイプのパラメーターでは、コンパイラが正しい返品タイプを選択できますが、暗黙のパラメーターメカニズムはクラスユーザーからこの追加パラメーターを隠します。私はこれを試しました:

Map(1 -> "a", 2 -> "b").map((t) => (t._2) -> (t._1)) // returns Map("a" -> 1, "b" -> 2)
Map(1 -> "a", 2 -> "b").map((t) =>  t._2)            // returns List("a", "b")

それは正しく行われた多型です。

さて、それは主流のパラダイムではなく、多くの人を怖がらせるでしょう。しかし、それはまた、その表現力と優雅さを大切にする多くの人を引き付けるでしょう。

残念ながら、あなたが与えた地図の署名は、地図にとって誤ったものであり、実際に正当な批判があります。

最初の批判は、地図の署名を破壊することにより、より一般的なものがあるということです。これがデフォルトでは美徳であると信じることは一般的な誤りです。そうではありません。マップ関数は、共変動ファンチャーFX->(x-> y) - > FYとして非常に明確に定義されています。 「マップ」に起因する他のものはすべて悲劇です。

与えられた署名は別のものですが、それはマップではありません。私がそれを試みているのは、紙からの「トラバース」署名の専門的でわずかに変更されたバージョンであるイテレーターパターンの本質です。これがその署名です:

traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)

Scalaに変換します。

def traverse[A, B](f: A => F[B], a: T[A])(implicit t: Traversable[T], ap: Applicative[F]): F[T[B]

もちろん失敗します - それは十分に一般的ではありません!また、それはわずかに異なります(Identityファンチャーを介してトラバースを実行することでマップを取得できることに注意してください)。ただし、図書館の作家が十分に文書化されている図書館の一般化をよりよく知っていた場合(前述の効果を伴うアプリケーションプログラミングが前述)、このエラーが表示されないと思います。

第二に、マップ関数は、補完的なもので使用されているため、Scalaの特別ケースです。残念ながら、装備を備えているライブラリデザイナーは、包括的な構文の砂糖を犠牲にすることなく、このエラーを無視できないことを意味します。言い換えれば、Scala Library Designersが方法を破壊する場合、これは簡単に無視されますが、マッピングしないでください!

誰かがそれについて話すことを願っています。なぜなら、それは、Scalaが作ることを主張するエラーを回避するのが難しくなるからです。つまり、「平均的なプログラマーからの無責任な異議(すなわち、あまりにも難しい!)」の解決策は、「彼らを容易にするために彼らをなだめる」のではなく、代わりに、より良いプログラマーになるためのポインターと支援を提供します。私とScalaの目的は、この問題について争っていますが、あなたのポイントに戻ります。

「平均的なプログラマー」から特定の応答を予測して、おそらくあなたは主張をしていました。つまり、「しかし、それはあまりにも複雑です!」と主張する人々はまたはそのようなもの。これらは、あなたが言及するイゲまたはブロッホです。反知性主義/プラグマティズム運動のこれらの人々に対する私の反応は非常に厳しいものであり、私はすでに応答の弾幕を予想しているので、私はそれを省略します。

Scalaライブラリが改善されることを本当に願っています。少なくとも、エラーが角に安全に隠れることができることを願っています。 Javaは、「役に立つことをやろうとする」ことは非常に費用がかかる言語であるため、圧倒的な量のエラーを避けることができないため、それはしばしば価値がありません。同じ道を下って行かないようにScalaに懇願します。

私は質問とマーティンの答えの両方に完全に同意します:)。 Javaでさえ、ジェネリックでJavadocを読むことは、余分なノイズが原因であるよりもはるかに難しいです。これは、質問の例コードのように暗黙的なパラメーターが使用されるScalaで複合されています(Inflicitsは非常に便利なコレクションモーフィングを行います)。

私はそれ自体が問題であるとは思わない - 私はそれがより多くのツールの問題だと思う。そして、私はヨルグ・W・ミッタグが言っていることに同意しますが、スカラドック(またはあなたのIDEのタイプのドキュメント)を見ると思います - それは、方法が何であるか、それが何を取るか、戻ってくるのに、できるだけ少ない脳の力を必要とするはずです。それを手に入れるために、ちょっとした紙の上で少し代数をハックする必要はないはずです:)

確かに、IDEは、可変/式/タイプのすべての方法を表示する良い方法が必要です(Martinの例と同様に、すべてのジェネリックがインライン化されているため、優しくて簡単にグロックできます)。私はデフォルトでインクリッツを隠すというマーティンのアイデアが好きです。

Scaladocで模範を取るために...

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

Scaladocでこれを見るとき、私はデフォルトでデフォルトで隠された一般的なブロックと暗黙のパラメーターを隠したいです(マウスで小さなアイコンをホバリングすると表示されるかもしれません) - Grokへの追加のものとしてそれを読むことは通常それほど関連性がありません。例えば、これがどのように見えたか想像してみてください...

def map(f: A => B): That

それが何をするのか、素晴らしく明確で明白です。 「それ」とは何か、マウスまたはクリックすると、[B、その]テキストが「その」を強調表示するテキストを拡張できます。

たぶん、[]宣言と(暗黙的...)ブロックに小さなアイコンを使用できるかもしれないので、声明のほとんどが崩壊したことは明らかですか?トークンを使用するのは難しいですが、使用します。今のところ...

def map.(f: A => B).: That

したがって、デフォルトでは、タイプシステムの「ノイズ」は、人々が見る必要があるものの80%の主な80%から隠されています - メソッド名、そのパラメータータイプ、およびそのリターンタイプは、詳細への拡張可能なリンクがほとんどありません。あなたが本当にそんなに気にかけているなら。

ほとんどの人は、Scaladocを読んで、タイプでどのような方法を呼び出すことができるか、どのパラメーターを渡すことができるかを調べています。私たちは、ユーザーにあまりにも多くの詳細を備えた過負荷になります。

これが別の例です...

def orElse[A1 <: A, B1 >: B](that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

ジェネリック宣言を隠した場合、読みやすい

def orElse(that: PartialFunction[A1, B1]): PartialFunction[A1, B1]

たとえば、A1がA1の宣言を示すことができた場合、A1 <:A。コバリアントで矛盾したタイプがジェネリックに含まれていることを示すことができます。

私はあなたにそれを壊す方法がわかりませんが、私はケンブリッジから博士号を取得しています、そして私は2.8をうまく使っています。

さらに真剣に、私は2.7で時間を費やしたことはほとんどありませんでした(私が使用しているJava Libraryとの間に操作することはありません)、1か月以上前にScalaを使い始めました。私はHaskellの経験があります(それほど多くありません)が、あなたが心配しているものを無視し、Java(私が生計を立てるために使用している)との私の経験に合った方法を探しました。

だから:私は「新しいユーザー」であり、延期されませんでした - それがJavaのように機能するという事実は、私が理解していないビットを無視するのに十分な自信を与えてくれました。

(しかし、私がScalaを見ていた理由は、それを職場でプッシュするかどうかを部分的に確認するためであり、私はまだそうするつもりはありません。変化と開発されている(公平になるために、私が最も驚いたのはそれがどれほど素晴らしいかということでしたが、変化はすぐに来ました)。だから私が言っていることは、それを入れるために限られたリソースがむしろむしろ好まれたいということだと思います最終的な状態 - 私は彼らがこれがすぐにこれほど人気になることを期待していたとは思わない。)

Scalaはまったく知らないが、数週間前はClojureを読むことができなかった。今、私はそれのほとんどを読むことができますが、まだ最も単純なものを超えて何も書くことはできません . 。 Scalaも例外ではないと思います。学習方法に応じて、良い本やコースが必要です。読んでいるだけです 地図 上記の宣言、私は手に入れました 多分 その1/3。

大きな問題はこれらの言語の構文ではなく、 パラダイム これにより、日常の生産コードで使用可能になります。私にとって、JavaはC ++からの大きな飛躍ではありませんでした。これはCからの大きな飛躍ではありませんでした。これはパスカルからの飛躍でもありませんでした... 大きな飛躍(とにかく私にとって)。 Scalaでは、JavaスタイルやScalaスタイルでコーディングできると思います。しかし、Clojureでは、Javaからあなたの命令的な習慣を守ろうとするかなりの混乱を生み出します。

Scalaには、非常に複雑で学問的に見えるが、物事を使いやすくするように設計された多くのクレイジーな機能(特に暗黙のパラメーターが関係している場合)があります。最も便利なものは、構文砂糖を取得します( [A <% B] つまり、タイプAのオブジェクトは、タイプb)のオブジェクトへの暗黙的な変換と、それらが何をしているかについて十分に文書化された説明を持っていることを意味します。しかし、ほとんどの場合、これらのライブラリのクライアントとして、暗黙のパラメーターを無視し、正しいことをすることを信頼することができます。

これは人々がスカラに来るのを先送りにするつもりですか?

Scalaには多くのパワーがあり、その構文はHaskell、OCAML、SML、LISPS、LISPS、Java/C ++/PHPプログラマーとは異なるため、人気のあるScalaがどのように人気のあるかに影響を与える主な要因ではないと思います。等..

しかし、Scalaの人気は、Javaが今日の場所よりも少ないことでプラッショナルになると思います。なぜなら、次の主流の言語は非常に単純化されている必要があると思うので、そこに到達する唯一の方法は純粋な不変性、つまりHTMLのような宣言ですが、チューリングは完全である。しかし、私はそのような言語を開発しているので偏見がありますが、私はスカラが必要なものに十分ではないという数ヶ月の研究で除外した後にのみそうしました。

これは、専用の博士課程の学生だけが理解できる学問的な遊びとして、商業世界でScalaに悪い名前を与えるのでしょうか? CTOとソフトウェアの長は怖くなるでしょうか?

Scalaの評判はHaskell Complexに苦しむとは思わない。しかし、ほとんどのプログラマーにとっては、Scalaを使用するように強制するユースケースをまだ見ていないため、一部の人はそれを学ぶことを延期すると思います。おそらく、非常にスケーラブルなサーバー側は、最も説得力のあるユースケースです。

また、主流市場では、最初の学習Scalaは「新鮮な空気の息吹」ではありません。最初にHTMLやPythonを使用するなど、すぐにプログラムを作成しています。 Scalaは、最初からつまずく詳細をすべて学んだ後、あなたの上で成長する傾向があります。しかし、もし私が最初からScalaでプログラミングを読んでいたなら、学習曲線の私の経験と意見は異なっていたでしょう。

図書館は賢明なアイデアを再設計しましたか?

絶対。

Scalaを商業的に使用している場合、これについて心配していますか?すぐに2.8を採用するか、何が起こるかを見るのを待っていますか?

Scalaを新しい言語の最初のプラットフォームとして使用しています。 Scalaを商業的に使用していたら、Scalaのコレクションライブラリにコードを構築しないでしょう。私は独自のカテゴリ理論ベースのライブラリを作成します。一度見たとき、Scalazのタイプの署名はScalaのコレクションライブラリよりもさらに冗長で扱いにくいことがわかりました。その問題の一部は、おそらくScalaのタイプクラスを実装する方法であり、それが私が自分の言語を作成している小さな理由です。


私はこの答えを書くことにしました。なぜなら、Scalaのコレクションクラスのデザインを自分の言語のためにしているものと比較し、比較することを強制したかったからです。私の思考プロセスを共有するかもしれません。

2.8 SCALAコレクションビルダーの抽象化の使用は、サウンドデザインの原則です。以下の2つのデザイントレードオフを調べたいと思います。

  1. 書き込みのみコード:このセクションを書いた後、私は読みます Carl Smotriczのコメント これは、私がトレードオフになると予想していることに同意します。 James StrachanとDavetron5000のコメントは、その意味([b]でさえありません)と暗黙のメカニズムが直感的に把握するのは容易ではないことに同意します。以下の問題#2でモノイドの使用をご覧ください。これははるかに明確だと思います。 Derek MaharのコメントはScalaを書くことについてですが、「一般的な場合」ではない他の人のScalaを読むことはどうでしょうか。

    私がScalaについて読んだ批判の1つは、他の人が書いたコードを読むよりも、それを書く方が簡単だということです。そして、私はこれがさまざまな理由で時々真実であると思います(例:機能、自動閉鎖、DSLSのユニットなどを書くための多くの方法)が、これが主要な要因である場合、私は未定です。ここで、暗黙の関数パラメーターの使用にはプラスとマイナスがあります。プラス面では、冗長性を低下させ、ビルダーオブジェクトの選択を自動化します。 Odersky'sで ビットセット、つまりセット[int]から[string]への変換は暗黙的です。コードの馴染みのない読者は、現在のパッケージ範囲に存在する可能性のあるすべての目に見えないすべての目に見えない暗黙のビルダー候補について十分に推論できない限り、コレクションのタイプが何であるかを容易に知らないかもしれません。もちろん、経験豊富なプログラマーとコードのライターは、ビットセットがintに限定されていることを知っているため、文字列へのマップは別のコレクションタイプに変換する必要があります。しかし、どのコレクションタイプですか?明示的に指定されていません。

  2. アドホックコレクションデザイン:このセクションを書いた後、私は読みました トニー・モリスのコメント そして、私がほぼ同じポイントを作っていることに気づきました。おそらく、私のより冗長な博覧会は、ポイントをより明確にするでしょう。

    「タイプとの戦い」Odersky&Moorsでは、2つのユースケースが提示されています。これらは、bitsetのint要素の制限であり、タプル要素をペアにするためにマッピングされ、一般的な要素マッピング関数a => bが代替の宛先コレクションタイプを構築できる必要がある理由として提供されます。ただし、これはカテゴリ理論の観点から欠陥があります。カテゴリ理論で一貫性を保ち、したがってコーナーケースを避けるために、これらのコレクションタイプは、各モルフィズムa => bが同じファンチャーカテゴリのオブジェクト間でマッピングする必要があるファンクターであり、リスト[a] => list [b]、biteset [a] => bitset [b]。たとえば、オプションは、(オブジェクト)およびなしのセットのセットのコレクションと見なすことができるファンチャーです。 「空の」状態を持たない他の機能者には、オプションのnoneまたはlistのnilからの一般的なマップはありません。

    ここにはトレードオフデザインの選択があります。私の新しい言語のコレクションライブラリのデザインでは、すべてをファンチャーにすることを選択しました。つまり、ビットセットを実装する場合、非ビットフィールド内部表現を使用して非ビットフィールドの内部表現を使用して、非ビットフィールドの内部表現を使用してサポートする必要があります。整数型パラメーター、およびその機能はすでにSCALAで継承するセットにあります。私のデザインのマップは、その値のみをマップする必要があり、その(キー、値)ペアのタプルをマッピングするための個別の非統一方法を提供できます。利点の1つは、各ファンチャーが通常、適用的であり、おそらくモナドでもあることです。したがって、要素タイプの間のすべての関数、例:a => b => c => d => ...は、持ち上げられたアプリケーションタイプ間の関数に自動的に持ち上げられます。 c] => list [d] => ....ファンチャーから別のコレクションクラスへのマッピングのために、モノイドを取得するマップオーバーロードを提供します。 。したがって、ビルダーの抽象化関数はモノイドの付録方法であり、必要な入力パラメーターとして明示的に提供されるため、目に見えない暗黙的変換はありません。 (Tangent:この入力パラメーターは、ScalaのマップデザインにはできないAppendingから空のモノイドへのアプリを有効にします。)そのような変換は、同じイテレーションパスのマップと折り目です。また、カテゴリの意味で、「エフェクト付きのアプリケーションプログラミング」McBride&Pattersonのトラバー可能なものを提供します。これにより、ほとんどすべてのコレクションクラスが両方である任意の任意のアプリケーションへの1回の反復パスでMAP + Foldが可能になります。また、State Monadは適用的なものであるため、移動可能なあらゆるものから完全に一般化されたビルダーの抽象化です。

    したがって、SCALAコレクションは、カテゴリ理論に基づいていないという意味で「アドホック」であり、カテゴリ理論は高レベルの表現セマンティクスのエッセンスです。 Scalaの暗黙的なビルダーは、ファンチャーモデル +モノイドビルダー +トラバース可能な - >アプリケーションよりも「一般化された」最初の登場ですが、それらはどのカテゴリと一致していることが証明されていないため、彼らがどのようなルールに従うかはわかりません。最も一般的な感覚とコーナーケースが与えられるものは、カテゴリモデルに従わない場合があります。より多くの変数を追加すると何かがより一般的なものになることは単に真実ではありません。これは、カテゴリ理論の大きな利点の1つであり、高レベルのセマンティクスを持ち上げながら一般性を維持するためのルールを提供することです。コレクションはカテゴリです。

    私はどこかを読んだことがありますが、ライブラリデザインの別の正当化として、それはOderskyだったと思います。純粋な機能スタイルのプログラミングには、尾の再帰が使用されない限られた再帰と速度のコストがあります。これまでに遭遇したあらゆる場合に、尾の再帰を使用することは難しいとは感じていません。


さらに、Scalaのトレードオフの一部は、Haskellや私が開発している言語とは異なり、可変で不変の言語の両方にしようとしているためであるという不完全な考えを心に伝えています。これは、包括についてのトニー・モリスのコメントに同意します。私の言語では、ループも可変構造もありません。私の言語はScalaの上に座って(今のところ)、それに大いに負っています。これは、Scalaに一般的なタイプのシステムと可変性がなければ不可能です。 Odersky&Moors(「タイプとの戦いのビット腐敗」)は、Scalaがより高等の唯一のOOP言語であると述べるのに間違っていると思うので、それは真実ではないかもしれません。 MLにはそれらがあります。また、SMLのタイプシステムは同等に柔軟性がある可能性があります(1980年代以降)。これは、SCALAのように構文がJava(およびC ++/PHP)にあまり似ていないため、容易に評価されない場合があります。いずれにせよ、これはScalaに対する批判ではなく、トレードオフの不完全な分析を提示する試みであり、質問に密接に関係していることを願っています。 ScalaとSMLはHaskellが行うことができないことに苦しんでいません ダイヤモンド多重継承, 、これが重要であり、私が理解しているのは、なぜHaskell Preludeの非常に多くの機能が異なるタイプで繰り返されるのかを理解しています。

ここで学位を述べる必要があるようです:政治学の学士号とコンピューターサイエンスのB.Ed。

ポイントへ:

これは人々がスカラに来るのを先送りにするつもりですか?

Scalaは困難です。なぜなら、その基礎となるプログラミングパラダイムは困難だからです。機能的なプログラミングは多くの人々を怖がらせます。 PHPで閉鎖を構築することは可能ですが、人々はめったにしません。したがって、この署名ではありませんが、残りのすべては、根底にあるパラダイムの力を高く評価するための特定の教育を受けていない場合、人々を先送りにします。

この教育が利用可能な場合、誰もがそれを行うことができます。昨年、私はScalaにたくさんの学校の子供たちと一緒にチェスコンピューターを構築しました!彼らには問題がありましたが、最終的にはうまくいきました。

Scalaを商業的に使用している場合、これについて心配していますか?すぐに2.8を採用するか、何が起こるかを見るのを待っていますか?

私は心配しません。

私もオックスフォードから数学の学位を取得しています!新しいコレクションのものを「入手」するのに時間がかかりました。しかし、私は今、私がやっている今それがとても好きです。実際、「MAP」のタイピングは、2.7で私を悩ませた最初の大きなものの1つでした(おそらく私が最初にしたことは、コレクションクラスの1つのサブクラスでした)。

新しい2.8コレクションに関するMartinの論文を読むことは、Implicitsの使用を説明するのに本当に役立ちましたが、はい、ドキュメント自体は間違いなく、コアAPIのメソッドシグネチャ内でさまざまな種類のインクリットの役割を説明するためのより良い仕事をする必要があります。

私の主な関心事はこれです:2.8はいつリリースされるのですか?バグレポートはいつ入るのをやめますか? Scalaチームは、2.8で噛むことができる以上に噛み付いたのですか?

2.8がリリースのために優先事項として安定して、他の新しいものをまったく追加する前に、(傍観者から見ている間)Scalaコンパイラの開発ロードマップが管理される方法にいくつかの改善ができるかどうかを考えたいと思います。

使用サイトでのエラーメッセージはどうですか?

そして、既存のタイプをDSLに適合するカスタムタイプと統合するために必要なユースケースが必要です。関連性、優先順位、暗黙の変換、暗黙的なパラメーター、より高い種類、およびおそらく実存的なタイプについて十分に教育されなければなりません。

ほとんどが単純であることを知っているのはとても良いことですが、必ずしも十分ではありません。少なくとも、広範囲にわたるライブラリを設計する場合、このようなことを知っている男が1人いるに違いありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top