タグ

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

  • 無名関数のためのプレースホルダ構文の特異性 ~Scala Advent Calendar 2015じゃないよ~ - kmizuの日記

    当はScala Advent Calendarの記事として書こうと思っていたのですが、既にだいたい埋まってしまっていたので、自分のブログで書きます。Scalaistの皆さん、プレースホルダ構文、使ってますよね? List(1, 2, 3, 4, 5).map(_ + 1) // List(2, 3, 4, 5, 6) という風にして使うアレです。使ったことはなくとも、Scalaをギョームで使っておられる皆さんもギョームで使っておられない皆さんも一度は見たことがあるのではないかと思います。この構文、正確には、 Scala Language Specification 6.23.1で「Placeholder Syntax for Anonymous Functions」として定義されている機能ですが、長いのでプレースホルダ構文としましょう。ちなみに、 scala> Math.abs _ re

    無名関数のためのプレースホルダ構文の特異性 ~Scala Advent Calendar 2015じゃないよ~ - 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 (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の日記
  • 『プログラミングの魔導書 〜Programmers' Grimoire〜 Vol.3』 所感 - kmizuの日記

    Vol. 2の時に記事を寄稿した関係もあり、事前にPDF版をいただいていました。ようやく一通り目を通したので、簡単な紹介をしたいと思います。なお、注文はこちらから。 魔導書Vol.3の副題は「“Parallel, Concurrent, and Distributed Programming”並行世界の魔物に人類はどう立ち向かうのか。」です。 目次は以下のようになっています。各記事は、最初の2ページ程度試し読みが可能ですので、興味をもった方はそちらを読んでみるのも良いかと思います。 序文 熊崎 宏樹 Lock-free入門 熊崎 宏樹 OpenACC 藤田 典久 ErlangとScalaにおけるアクターモデルの紹介 幾田 雅仁 C#の非同期処理 岩永 信之 Real World STM ~作って学ぶSTM~ 石井 大海 データ並列への招待 shelarcy 合成可能なメッセージパッシング

    『プログラミングの魔導書 〜Programmers' Grimoire〜 Vol.3』 所感 - kmizuの日記
  • 部分適用をカリー化と呼ばないで - kmizuの日記

    カリー化と部分適用の違いについては、過去のエントリ カリー化 != 部分適用 で既に述べており、決着もついているので改めて書きません。 カリー化 != 部分適用のエントリを書いたのは2009年12月です。もう3年以上前の話になります。ですが、JavaScript界隈などをみると、未だにカリー化と部分適用の違いについての誤解は残っているようです。一方で、静的型付き言語界隈でそのような誤解をほとんどみかけません。カリー化が関数の「型」を変換する操作(関数)であるために、動的型付き言語にのみ慣れ親しんでいると、両者の違いがわかりにくいのかもしれません。 ある技術用語が指すものを誤解する事自体は仕方ないことですし、責めるものではありません。また、用語が指すものは時代を経ると変わっていくものだという主張もあるでしょう。ただ、カリー化という用語の定義は明確に定義されており、数十年もの歴史があります。こ

    部分適用をカリー化と呼ばないで - kmizuの日記
  • sbt + sbt-idea + Intellij Scala Pluginを使ったScala開発 (in Mac OS X) - kmizuの日記

    注意:この記事の内容は、2013年7月2日現在、やや古くなっています。現在は「Use external build」のチェックはONにしたままで、「Use project FSC」をチェックしない方が安定して動作します。これは、最近のアップデート(ここ1〜2ヶ月くらいの話ですが)「Use external build」を使ったときに、IDEAが内部でzincというsbtベースのスタンドアロンなコンパイラを内部で使うようになった事に起因しています。コンパイラの設定以外は現在でもそのまま通用しますが、このエントリを読んでIntelliJ IDEA + ScalaプラグインによるScala開発を行おうとしている人は注意してください。 これは、Scala入門をIntelliJ IDEAでやろうとしている人向けのエントリではありません。このエントリでは、IntelliJ IDEAのScalaプラグイ

    sbt + sbt-idea + Intellij Scala Pluginを使ったScala開発 (in Mac OS X) - kmizuの日記
  • Scalaに関するよくある誤解(1) - 最後の処理の値が返り値になるのでreturnは不要 - kmizuの日記

    Scala 2.10.0 M3試してみる記事はいったんおいといて、前からよく見かけるScala(に限った話でもないですが)に関する誤解(とも言い切れないですが)について少し書いてみます。 Scalaで以下のようなコードがあったとき、 def add(x: Int, y: Int): Int = { return x + y } 「Scalaでは最後の処理の値が返り値になるので、returnは不要」であるため、 def add(x: Int, y: Int): Int = { x + y } のように書けるのだ、という説明をよく見かけます。 しかし、この説明は正しくありません。「最後の処理」といいますが、それは、一体「何の」最後の処理なのでしょうか。 この説明の問題を理解するには、Scalaが「式」ベースの言語である事を理解する必要があります。まず、Scalaのメソッド定義の一般形は def

    Scalaに関するよくある誤解(1) - 最後の処理の値が返り値になるのでreturnは不要 - kmizuの日記
  • Scalaに関して知っておくべきたった一つの重要な事 - kmizuの日記

    タイトルは釣りです。先日、大昔に見た懐かしい記事が翻訳されていました。この記事自体ははっきり言って、ScalaはOCamlではないということを言葉を変えて延々と言ってるだけなので、どーでもいいです。3年も前の英語記事がTwitter上で今更注目された事に驚きです。 さて、題に入りましょう。元記事の言っている事はおいておいて、Scalaの核言語は(若干風変わりな)クラスベースのオブジェクトシステムであるという事は、頭の片隅においておくと良いと思います。Scalaの関数型プログラミングサポートの多くは、関数型言語に見られる機能をオブジェクト指向的に再解釈して取り込んだものであり、中心にあるのはあくまでオブジェクトです。 (追記) 核言語(core language)という言葉に馴染みが無い方も居ると思うので、説明を追加します。核言語という考え方は、プログラミング言語を、まさにその核である核言

    Scalaに関して知っておくべきたった一つの重要な事 - kmizuの日記
  • プログラミング言語Scala日本語情報サイト協力者募集中 - kmizuの日記

    今年5月くらいから、Scalaに関する日語情報を一極集中化してまとめるサイトを目指して、プログラミング言語Scala語情報サイトというサイトを開設して、少しずつ更新していたのですが、最近、私生活の方が忙しい事もあって、あまり更新時間が取れていません。何名か協力していただいている方も居られるのですが、それらの方もやはり私生活等が忙しく、なかなか時間を割けていない状況です。 そこで、プログラミング言語Scala語情報サイトの運営・記事執筆を手伝ってくださる方を募集したいと思います。特に、必要な技術スキルなどはありません。日Scala情報をまとめたい!と思ってくださる方なら歓迎いたします。 さしあたって、更新が遅延しているのが Scalaのニュース記事の翻訳 で、この辺り、もし、お手伝いしていただける方が居れば幸いです。また、それ以外でも、まだまだ情報が充実していない部分が多くあり

    プログラミング言語Scala日本語情報サイト協力者募集中 - kmizuの日記
  • Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について - kmizuの日記

    2011/07/03:末尾に補足を追記しました。 id:xuwei さんのエントリから引用します。 最近ちょっとRubyやってたりします。で、RubyのEnumerableにgrepっていうメソッドがあるらしいけど、Scalaには直接対応するものがないので、かなり雑につくってみた 誰得?(・ω・`)っていうか、ジェネリックにしようとしたら意外と難しくてできなかった*1んだけどどうやるの・・・Scala1年半以上やっててそんなこともできなくて死にたい orz まず、 id:xuwei さんが、来満たしたい仕様を実現するのはさほど簡単なことでもないので*1、特に気される必要は無いかと思います。 説明が長くなるので、先に結論から言うと次のコードで id:xuwei さんの要求を満たすことができます。 このコードは次のようにして使うことができます。 REPLの例を見ていただければわかるように、S

    Stringを要素に持つ任意のコレクションにgrepを適用できるようにする - あるいはScalaの暗黒面について - kmizuの日記
  • Scalaはオブジェクト指向言語です(4) - kmizuの日記

    ネタ切れもいいところなのですが、前回の続きです。前回の引きで、 実際には、sealedは、単に列挙型のパターンマッチ記述漏れを検出するだけの機能ではないのですが、それを説明するのは面倒なので、また次の記事で紹介しましょう。 ではでは。 と書いたのですが、今回はそれの説明です。前回、 abstract sealed class Language case object JAVA extends Language case object SCALA extends Language case object CSHARP extends Language //俺も仲間に入れてくれ というコード例を示してみせたのですが、実は、これは来の機能が縮退した形です。上記の例では、列挙型の値(相当)のものがパラメタを取ることはありませんでしたが、一般的には、パラメタを取ることができます。 とだけ言っても何

    Scalaはオブジェクト指向言語です(4) - kmizuの日記
  • Scalaはオブジェクト指向言語です(3) - kmizuの日記

    さて、引き続きふつーのオブジェクト指向言語としてのScalaを説明していきます。…と言いたいところなのですが、早くもネタ切れしてきました。ですが、行けるとこまで行ってみましょう。 sealed:列挙型の漏れを検出してくれるくらいの機能 この解説は実際には間違いなのですが、sealedの99.999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999%がこの用途だと思って問題ないでしょう*1。 さて、sealedの来の意味はどうでもいいので、何のために使えるかを説明することにします。 まず、前提として、ScalaにはCとかC#やJava 5以降にあるような列挙型がありません。というと、列挙型を普段使っておられる方においては、大変不便に感じられるかもしれ

    Scalaはオブジェクト指向言語です(3) - kmizuの日記
  • Scalaはオブジェクト指向言語です(2) - kmizuの日記

    1日空いてしまいましたが、引き続きふつーのオブジェクト指向言語 としてのScalaを説明していきます。 高階関数:ただのメソッド これはジョークではなく、当にただのメソッドなのです。とりあえず、説明は後にして、代表的な高階関数である、mapScala実装を見てみましょう*1。 def map[A, B](list: List[A], fun: A => B): List[B] = { val newList = new ArrayList[B] val it = list.iterator() while(it.hasNext()) { newList.add(fun.apply(it.next())) } newList } 利用例は以下のようになります。 val a = new ArrayList[String]{ add("A"); add("B") } println(map(

    Scalaはオブジェクト指向言語です(2) - kmizuの日記
  • 「ここがヘンだよScala言語」についてのまとめ - kmizuの日記

    ここがヘンだよScala言語の記事に突っ込みどころが多かったので、色々書いたのですが、ちょっとコメントの書き方が挑発的過ぎたので、こちらのエントリでまとめなおします。 if式の返り値 val v1 = if (1 < 2) {"a"} println(v1) val v2 = if (1 < 2) {"a"} else {"b"} println(v2) v1はUnit、v2は"a"。else節が無い場合、「最後に評価された式を、返り値とする」というルールから外れる。 2.8.1、2.9.0等、現行の版では、v1、v2ともに"a"が返る。ルール通りの動きで問題はない。 取り消し線と訂正がありますが、それについては題とは関係無いので省きます。重要なのは、Scalaには「最後に評価された式を、返り値とする」というルールは最初から存在しないのに対して、そのようなルールが存在すると勘違いされてい

    「ここがヘンだよScala言語」についてのまとめ - kmizuの日記
  • Scala 2.9.0のscala.sys.processパッケージが便利過ぎる件について - kmizuの日記

    先日、Scala 2.9.0 RC4がリリースされ、正式リリース(final)までもうあと少しといった感じになって来ましたが、皆様、いかがお過ごしでしょうか。訓練されたScala使いはRCには手を出さないとも言われますが、私は新し物好きなので、RCにも手を出してしまいます。 それはともかくとして、Scala 2.9.0の最大の目玉は何でしょうか?世間的(どこの世間だというツッコミはおいといて)には並列コレクションではないでしょうか。Scalaの公式サイトでも新機能の紹介で真っ先に挙げられていますし、少なくとも一番注目されているのは並列コレクションでしょう。 並列コレクションは、公式サイトも含め、英語圏のブログなどあちこちで既に紹介されているので、このエントリではあえて、その陰に隠れてあまり注目されないが、なかなか便利なscala.sys.processパッケージについて紹介します。 sca

    Scala 2.9.0のscala.sys.processパッケージが便利過ぎる件について - kmizuの日記
  • JavaとScalaとC#のジェネリクス機能比較表 - Onion開発しつつ、PEGEXを開発する日記

    JavaScalaとC#のジェネリクスは、いずれも継承を持ったオブジェクト指向言語においてParametric Polymorphismを実現するための手段であり、それぞれ異なった特性を持っている。というわけで、それぞれの言語においてジェネリクスがどのようにサポートされているかを比較した表を用意してみた。後で気が向いたら、各項目の説明を追加するかも。 Java(5.0以降) Scala C#(4.0) ジェネリックなクラス ○ ○ ○ ジェネリックなメソッド ○ ○ ○ 型パラメータの上限 ○ ○ ○ 型パラメータの下限 × ○ × 型パラメータの推論 ○ ○ ○ 全ての型のサブタイプ(ScalaにおけるNothing) × ○ × definition-site variance × ○ ○ use-site variance ○(Wildcard) ○(Existential Typ

    JavaとScalaとC#のジェネリクス機能比較表 - Onion開発しつつ、PEGEXを開発する日記
  • Scala変態技法最速マスター - kmizuの日記

    Java変態文法最速マスターなんてのがかなりブクマされてるみたいだが、変態さならJavaなんてScalaの足元にも及ばないぜ!!ということで、Scala版を書いてみました。しかし、実はあまり変態ではないかもしれません。元ネタと違って、これを読めば何かがわかる、という意味の実用性はあまり無いでしょう。 implicit conversion編 基 Scalaのimplicit conversionは使いようによってはScalaの強力な型システムを台無しにしてしまう力を持っています。たとえば、 implicit def string2int(x: String): Int = Integer.parseInt(x) というimplicit conversionを定義してやると、"300" / 3が100になるなどというキモい挙動を実現することができます。また、さらにカスタマイズして、16進数

    Scala変態技法最速マスター - kmizuの日記
    atm_09_td
    atm_09_td 2010/02/04
    実務には役立たないだろうけど。