タグ

ブックマーク / kmizu.hatenablog.com (13)

  • 技術イベント「Understanding Scala」を開催しました(6/10) - kmizuの日記

    Understanding Scala - connpass 昨日、表題の技術イベントを自分主催で行いました。なんでこんなイベントをやろうと思ったかというと「皆、Scalaを難しくめんどくさい方法で学んでるのでは?」という疑問が自分の中であって、その原因として、サンプルプログラムの集合を通して、ボトムアップになんとなくイメージで 全体像を作りあげてるのではという思いがありました。 そのようなアプローチに対して懐疑的な自分としては、このイベントでは(厳密にはやってませんが)どちらかというとトップダウン的アプローチでプログラミング言語について理解してもらおうと思い(もちろん、例は大切なので必要に応じて詳細に下りるのは忘れませんでしたが)、5つの発表の全てを全部自分でやりました。さすがに、5時間程度しゃべりっぱなしというのは疲れましたが、おかげさまで(?)、色々な疑問が解決したとか、メソッドと関

    技術イベント「Understanding Scala」を開催しました(6/10) - kmizuの日記
  • 型クラスの真の力を見せる - kmizuの日記

    昨日、 kmizu.hatenablog.com という記事を書いたわけだが、その後、今日、型クラスに関する議論が一部で(?)盛り上がっているようだ。それは型クラスじゃなくても実現できるのでは、いや、やっぱりインタフェースのようなものと思っていいのでは、などなど。 今回の記事では、型クラスじゃないと実現が著しく困難であると思われる 使い方について書くことにする。 まず、前の記事では、Orderingの使い方を通して、型クラスの単純な使い方について説明したのであった。単純なオブジェクトの場合はそれでもいいが、より複雑なオブジェクトをOrderingを使ってソートしたい場合、前回の記事のようなやり方だけでは難しいことがある。 一例として、(A, B)というタプル型、つまり、A型の要素とB型の要素からなるペアを比較して、ソートしたいという要求を考える(実際には、標準ライブラリでタプル型の比較が提

    型クラスの真の力を見せる - kmizuの日記
  • プログラミング言語作成ハンズオンを開催しました - kmizuの日記

    connpass.com 今回開催したこのイベントは、私が学習用に作成したプログラミング言語nub github.com の文法や機能拡張を通じて、プログラミング言語処理系の作成の基礎について学ぶというものでした。 自分がこのイベントを開催したねらいは主に二つあって、 プログラミング言語(処理系)作成に興味のある技術者を増やしたい プログラミング言語処理系初学者にとって、学びの障害となるのはどこか知りたい というものでした。準備には十分時間をかけたかったので、昨年秋から募集を始め、また、チューターとなってくれる 方も同時に募集しました。結果として、応募人数は十分過ぎる程、チューターも4名(うち2名は遠方(静岡と名古屋から!))来てくれる ことになりました。 チューターのno_maddoさん、yontaさん、long_long_floatさん、tetsuromさんの協力があったのは、特に、自

    プログラミング言語作成ハンズオンを開催しました - kmizuの日記
    clavier
    clavier 2017/01/23
  • Scalaの学習コストを下げるための心得 - kmizuの日記

    追記:Twitterで、「それって、言語マニアにしかできない技のような気が」という指摘を受けました。自分としては一般的に適用可能な話だと思っていますが、あるいは自分の感性が著しくずれているのかもしれません。その辺承知の上でお読みください。 Scalaは習得が難しい言語だ、とよく言われます。また、実際問題として、Scalaの言語仕様の全体はそれなりに複雑でもあります。しかし、それはたとえばJavaでも言語仕様の全体像を把握するのは難しい話であり、Scalaに限った話ではありません。にも関わらず、Scalaの習得が難しいとよく言われるのはプログラミング言語の学習モデルが誤っているからではないかと最近思うようになりました。そこで、Scala(や他の言語も含めて)のコストを下げるために必要な心得についてちょっと書いてみます。 Scalaはオブジェクト指向言語である これは、Scalaは関数型プログ

    Scalaの学習コストを下げるための心得 - kmizuの日記
  • 新しい言語を覚えるために私がした事(Kotlinの場合) - kmizuの日記

    先日の、Scala勉強会第170回 in 郷 : サブテーマ「Scalaの言語仕様」 rpscala.doorkeeper.jp でScalaの言語仕様について解説していたときの反応をみて、どうも、自分のプログラミング言語の把握の仕方はあまり一般的ではないのではということを考えました。どう違うかというと一言では説明できないのですが、世間的には、プログラミング言語については、よりフィーリング的になんとなく理解している部分理解していない部分がぼやーっとしているのに対して、自分の場合、理解している部分とそうでない部分の境界がくっきりしているような感じです。 それはともかくとして、このエントリでは、自分が最近新しく触った言語であるKotlinについて、どのようにして理解を進めたかを書いてみたいと思います。 公式ドキュメントを読む 定番といえば定番ですが、公式ドキュメントが一番正確に言語について書

    新しい言語を覚えるために私がした事(Kotlinの場合) - kmizuの日記
  • Kotlinのブロックからなる関数定義でreturnを書かなくて良いようにする - kmizuの日記

    Kotlinでは、一つの式からなる関数は fun add(x: Int, y: Int): Int = x + y のように明示的なreturnを必要としません。次のように複数の式からなる関数定義ではreturnが必須となります。 fun printAndAdd(x: Int, y: Int): Int { val k = x + y println(k) return k //必須 } この制限の理由について、Kotlinのリファレンスでは Kotlin does not infer return types for functions with block bodies because such functions may have complex control flow in the body, and the return type will be non-obvious to

    Kotlinのブロックからなる関数定義でreturnを書かなくて良いようにする - kmizuの日記
  • IOと例外の取り扱いについて:どっちが良いスタイル? - kmizuの日記

    追記:Java 7以降(つまり、現在)はtry-with-resources構文があるので、それを使えばよいです。ここでは、Java 6かそれ以前のコーディングスタイルについて主に言っています。 kmizu.hatenablog.com におけるkrxrossさんのコメント java脳だと、「fw = new PrintWriter(new File(file))」で例外が発生したら、fwが不定のまま、finally句の「fw != null」で困ってしまう。 そうならないために、nullで初期化するという話に見えます。 多分JAVAだと、nullを代入しないとコンパイルエラーになるか、eclipsが警告を出したと思います。 scalaでも同じではないですか ? 良く解っていない超初心者より を見て、強烈に不安になってしまったのですが、Javaだとこういうのが良いスタイルなんでしたっけ?

    IOと例外の取り扱いについて:どっちが良いスタイル? - kmizuの日記
  • 『Scalaファンクショナルデザイン ―関数型プログラミングの設計と理解』の雑感 - kmizuの日記

    表題の書籍について、出たとき(2015/5/29)に買って随分放置していたのだが、最近、一通り読んでみたので簡単な感想を書いてみようと思う。 結論からいうと、Scalaについて特に使う予定はないがおおまかにどんな言語か知っておきたいという方にはそこまで悪くないだが、副題の「関数型プログラミングの設計と理解」について書で学ぶのはオススメできない。そういう人には、Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイドをオススメしておこう。こっちのも、ScalaでHaskellスタイルのFPをすることにこだわり過ぎて、Scala Wayからは外れていると感じる部分もあるのだが、少なくとも関数型プログラミングについて丁寧に取り組んでいるとはいえる。 書を読む前に気になっていたのは、技術的な点での瑕疵がどの程度あるかということだったが、この点に関して

    『Scalaファンクショナルデザイン ―関数型プログラミングの設計と理解』の雑感 - kmizuの日記
  • 初学者向けの Scala Tips (5) - パターンマッチと無名関数の組み合わせを簡潔に書く - kmizuの日記

    Scala初学者の方が書くコードには、しばしば以下のようなものが散見されます。 list.map {x => x match { case A => case B => case _ => } } 無名関数を作るための構文である{x => ...}とexp match { case ... }を別々に考えるとこのようなコードになるのは無理はありません。しかし、これはもっと簡潔に書くことができます。改良したのが以下のコードです。 list.map { case A => case B => case _ => } 前者の書き方に比べて断然簡潔ですね。特別な事情がない限り、無名関数の引数を即座にパターンマッチする必要がある場合、後者の書き方を使いましょう。 ちなみに、この書き方を教えると結構びっくりされる方が多いようで、この構文はPartialFunctionのためのものだと思っていた、という

    初学者向けの Scala Tips (5) - パターンマッチと無名関数の組み合わせを簡潔に書く - kmizuの日記
  • 初学者向けの Scala Tips (4) - パターンマッチのcase節には複数の式が書ける - kmizuの日記

    ときどきみかけるコードなのですが、パターンマッチを使ったコードで、次のようなものがあります。 exp match { case A => { expA1 expA2 ... } case B => { expB1 exbB2 ... } } Scalaでは、case節に複数の式を続けて書くことができるのでこのようなブレースは不要です。 exp match { case A => expA1 expA2 ... case B => expB1 expB2 ... } としてしまいましょう。

    初学者向けの Scala Tips (4) - パターンマッチのcase節には複数の式が書ける - kmizuの日記
  • 初学者向けの Scala Tips (2) - nullからOptionへの変換 - kmizuの日記

    Scalaでnullを使っていいのは小学生までだよねー、というのは冗談ですが、Scala文化圏ではnullを使わないのが原則です(いくつか例外はありますが)。代わりに出てくるのがOption型です。しかし、Scalaでは困ったことにnullを返すJavaのメソッドを呼び出さなければいけない場面がたくさんあります。 たとえば、以下のようなコードを書かなければいけない場面にはしばしば遭遇します。 val javaMap: java.util.Map[String, String] = javaObject.getMapping() val value: String = javaMap.get(key) // 型注釈はあえて付けている if(value != null) { ... } else { ... } さて、ここで困るのが、javaMap.get(key)はkeyに対応する値が入って

    初学者向けの Scala Tips (2) - nullからOptionへの変換 - kmizuの日記
  • Scala 2.11.0で標準ライブラリから分離されたライブラリのjarファイル - kmizuの日記

    今日のScala勉強会第124回 in 郷で話題に出てたことの備忘録。Scala 2.11で、scala.util.parsing.combinatorとscala.xml、scala.util.continuationsが標準のライブラリから分離されたのだが、これを今まで通りに使うにはどうすればいいのか。実は、分離されたライブラリの内、前者二つは以下に https://oss.sonatype.org/content/repositories/releases/org/scala-lang/modules/ continuationsは https://oss.sonatype.org/content/repositories/releases/org/scala-lang/plugins/ に入っているので、これらを今まで通りに使うにはsbtの設定ファイルに libraryDepen

    Scala 2.11.0で標準ライブラリから分離されたライブラリのjarファイル - kmizuの日記
  • 初学者向けの Scala Tips (1) - Option#map()を使おう - kmizuの日記

    唐突に始まったScala Tipsコーナー、初学者が陥りがちなScalaのコードパターンを例にして、より良い方法を解説していきます。第一回はOptionクラスのmap()メソッドを使おうというものです。知ってる人には今更ですが、Option#map(f)は、レシーバーの値がSome(v)の場合は、fにvを渡した結果のSome(f(v))が、Noneの場合はNoneが返ります。したがって、パターンマッチを使った以下のようなコードは val result = exp1 match { case Some(v1) => val vx = //expression using v1 Some(vx) case None => None } 常に以下のような形に書き換えることができます。 val result = exp1.map{v1 => val vx = //expression using

    初学者向けの Scala Tips (1) - Option#map()を使おう - kmizuの日記
  • 1