タグ

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

  • Javaのジェネリクスは「まがい物」ではない - kmizuの日記

    先日、自分が書いた kmizu.hatenablog.com に対する反応として、「Javaのようなまがい物のジェネリクスと比較するのは適切でない」「Javaのジェネリクスと比較するのは適切でない」(おそらくC#や(C++等(2017/09/24追記))の言語と比較して)といった コメントをいくつか見かけました(はてなブックマークコメントやツイッターなどで)。しかし、ここでは、そのような言説こそが適切でない、ということを言いたいです。なお、methane氏との 対話については既に終わったものなので、それとは関係ありません。 そもそも、Javaジェネリクスは、静的型付き関数型言語で既に一般的であったパラメータ多相をJavaに追加する目的で導入されました(C++テンプレートのようなものをJavaに追加するためだと思っている人がいるかもしれませんが、それは実態にあっていません)。実際、Java

    Javaのジェネリクスは「まがい物」ではない - kmizuの日記
    coppieee
    coppieee 2017/09/24
    思った。何を持ってJavaのジェネリックスがまがい物って言ってるのかわからなかったわ
  • 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 3.0の新機能 - kmizuの日記

    注意:この記事はエイプリルフールのネタ記事です。エイプリルフールを過ぎてしばらく経つので、まぎらわしいかと思い、ここに書いておくことにします。 今年中には、再設計されたコレクションライブラリ、名前付き引数のサポート、部分継続などの数々の新機能をサポートしたScala 2.8がリリースされる見込みですが、その次の年には、早くもその次のバージョンであるScala 3.0がリリースされる予定です。Scala 3.0ではScala 2.8以上の抜的な言語仕様の変更がおこなわれるため、その全体を短いエントリの中で紹介することは不可能ですが、ここではScala 3.0の新機能の中で特徴的なものを紹介していきます。 型システムを、structural typeベースとして全面的に再設計! Scala 2.X系では基的な型システムはnominal、つまり、明示的な継承関係があるかどうかでサブタイプ関係

    Scala 3.0の新機能 - kmizuの日記
    coppieee
    coppieee 2010/04/02
    Scala3.0SUGEEEE。・・・ちくしょう。
  • 第14回 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜 - 刺激を求める技術者に捧げるScala講座:ITpro へのツッコミ - kmizuの日記

    ITProのScala連載「刺激を求める技術者に捧げるScala講座」の第14回 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜がはてなブックマークで150ブクマ超えるなど注目を集めていますが、読んで見ると初学者に誤解を与える箇所が散見されるので、一応、連載に関わってる者(といっても1回記事書いただけですが)の一人としてツッコミを入れさせていただきます。 「参照透明性を保持しながら手続き型的な記述をするための枠組み」?(p.1) モナドとは,関数型言語で,参照透明性を保持しながら手続き型的な記述をするための枠組みです。 早速ですが、これは、IOモナドやStateモナドには当てはまっても、全てのモナドについて当てはまるものではないですよね。たとえば、Maybeモナドではこれは当てはまりません。 「モナドがHaskellで必要な理由」? これはページタイトルの一部ですが

    第14回 関数脳のつくり方 Second Season 〜モナドで悟りをひらく〜 - 刺激を求める技術者に捧げるScala講座:ITpro へのツッコミ - kmizuの日記
  • 『やさしいScala入門 平明な例と演習問題で学ぶ』の感想というかダメだし - kmizuの日記

    発売日は2/22だが、秋葉原の書泉で先行販売?されてたので、購入した。このの著者がこれまでに書いたの評判がよろしく無いらしいことは、Twitterで事前に情報を入手していたから知っていたので、内容のひどさについてはある程度覚悟していたが、こりゃダメだ。何がダメって、細かい間違いがいくつもあるとかそれどころではなく、全体的にダメだ。以下、どのようにダメなのかについて、簡単に説明してみる。 関数型プログラミングについてほとんど触れられていない 「はじめに」には、次のようにある: (snip) オブジェクト指向と関数型プログラミングの両方を利用できるということは、Scalaをマスターするためには両方の概念と用語、そして、それらを結合する新しい概念とその用語を学ぶ必要があるということです。しかし、書では「Hello,Scala」を出力するための単純なプログラムからはじめて徐々に高度な内容にな

    『やさしいScala入門 平明な例と演習問題で学ぶ』の感想というかダメだし - kmizuの日記
    coppieee
    coppieee 2010/02/23
    読んでみたくなる・・・。
  • PEGのパーサ in Scala - kmizuの日記

    ScalaのパーザコンビネータでParsing Expression Grammar(PEG)の文法を定義してみました。PEGのインタプリタ作る副産物としてできたもので、構文木も作ってくれます。まあ、使いたい人が居るかは激しく疑問ですが、パーサコンビネータの使い方の参考になるかもしれません。ちなみに、 各ルールはセミコロンで終端する ルールの定義に、<-だけでなく、=も使える 点は、Fordの論文に載っているPEGの定義と異なっている部分です。 object Ast { trait HasPosition { def pos: Pos } case class Pos(line: Int, column: Int) case class Grammar(pos: Pos, start: Symbol, rules: List[Rule]) extends HasPosition case

    PEGのパーサ in Scala - kmizuの日記
  • Int#+の怪 - kmizuの日記

    Scalaでは32ビット符号付き整数を表すIntは特別な型ではなく、単にAnyのサブクラスであるAnyValのサブクラスであるIntクラスだという事になっているし、実際そのように扱われる。また、Intに対する+などの各種演算子も単なるIntクラスのメソッドであることになっているし、実際にそのように扱われる。では、Int型の+が単なるメソッドだとしたら、JavaのリフレクションAPIを経由して+メソッドを表すMethodオブジェクトを取得し、それを呼び出すことはできるのだろうか? 結論から言うと、無理である。まず、ScalaのInt型を使ったコードがクラスファイルにコンパイルされる際はJVMレベルでは可能な限りJVMのプリミティブ型であるint型を利用し、コレクションにInt型の値が格納される場合など、それが不可能な場合はjava.lang.Integer型に自動的にboxingされるように

    Int#+の怪 - kmizuの日記
  • JavaプログラマのためのIOモナド - kmizuの日記

    特に説明はしません。IOモナドなんて言っても、別に難しいことではなく、結局やってる事はこんな感じですというのがわかってもらえれば。もちろん、実際のHaskell処理系がこのような実装になっているという意味ではなく、JavaプログラマはこのようなイメージでIOモナドを理解すればいいのではないかという提案に過ぎないので、その点は注意してください。 package iomonad; import java.util.Scanner; public class IOLib { enum Unit{VALUE};//一つしか値を持たない型 public static Unit UNIT = Unit.VALUE; /** * HaskellのIO 'a型に相当 */ public interface IO<A> { /** * IOを「実行」して、A型の値を得る処理. * ユーザが直接呼び出すと参照

    JavaプログラマのためのIOモナド - kmizuの日記
  • Nemerleでコンパイル時に迷路を解いてみた - kmizuの日記

    故*1Nemerleのマクロは非常に強力で、コンパイル時でも実行時に行えるあらゆる事(計算はもちろんのこと、入出力、ネットワークIO、GUIなど)を行えるので、それを利用してコンパイル時に例の迷路を解くマクロを書いてみた。このマクロは、入力として迷路を表現してテキストを受け取り、迷路を解くのに成功した場合は、経路を書きこんだ迷路の文字列を結果として返し、解けない迷路の場合は、This maze cannot be solvedと表示し、コンパイルエラーにする。 using System; using System.Console; using System.IO.File; using Nemerle.Collections; using Nemerle.Imperative; using Nemerle.Compiler; macro SolveMaze(inputFile : stri

    Nemerleでコンパイル時に迷路を解いてみた - kmizuの日記
  • 無名関数を作るためのシンタックスシュガー - kmizuの日記

    普段Scalaのことばっかり書いてるこの日記だが、たまにはClojureの話題でも。Clojureには、無名関数を簡単に作るための構文があり、無名関数化したい範囲を#()で囲って、引数を与えたい部分に%を書くという感じで、短い無名関数を綺麗に書けるので気に入っている。たとえば、リストの全ての要素に1を足すという処理は、#()を使って以下のように記述できる。 user=> (map #(+ % 1) '(1 2 3 4 5)) (2 3 4 5 6) 無名関数の引数が複数ある場合も、もちろん対応していて、その場合は、第一引数は%1、第二引数は%2という具合に、%nという形で記述すれば良い。たとえば、リストの各要素を2乗した値を合計するという処理が以下のように書ける。このようなケースは、Scalaのプレースホルダ構文だとうまく書けない(同じ仮引数が複数個所に出現するため。複数引数の無名関数その

    無名関数を作るためのシンタックスシュガー - kmizuの日記
    coppieee
    coppieee 2010/01/11
    おお。Clojureってすげぇ!
  • ひょっとしたら役に立つかもしれないScala Tips(4) - パターンの漏れを検出する - Onion開発再開しつつある日記

    ScalaでMLやHaskellのalgebraic data typeを模倣するときの定番は、abstract class(or trait)とcase classを使って、 trait Exp case class Add(l: Exp, r: Exp) extends Exp case class Num(v: Int) extends Exp のようにすることだが、非常に残念なことに、これでは、MLなどと違って、パターンマッチ時にパターンの漏れがあってもコンパイル時にそれを検出することができない。たとえば、 def eval(e: Exp): Int = e match { case Add(l, r) => eval(l) + eval(r) //case Num(...)が抜けてる! } のようなコードを書いても、コンパイラは警告を出すことなく、黙って受け入れてしまう。このよう

    ひょっとしたら役に立つかもしれないScala Tips(4) - パターンの漏れを検出する - Onion開発再開しつつある日記
    coppieee
    coppieee 2009/12/31
    sealed trait Expでパターンマッチで漏れていたときにコンパイルエラー
  • Python風比較演算子をScalaで実装してみた - kmizuの日記

    Pythonでは0 < i < 10みたいに、数式っぽい形で数値の比較を行うことができる。これを、Scalaで(無理やり)エミュレートしてみた。汎用的に作ろうと思えば、もっと汎用的に作れるけどめんどいので、とりあえずInt型のみ対応。実装を見ればわかるけど、数式の構文木を作ってそれをevalしているようなものなので、(たぶん)かなり遅い。implicit conversionを使って、Boolean型が要求された時点で、比較演算の構文木をevalしてBoolean型を返すようにしているのがミソ。 object Op extends Enumeration { val LT = Value("<") val GT = Value(">") val LTE = Value("≦") val GTE = Value("≧") val AND = Value("∧") } import Op._

    Python風比較演算子をScalaで実装してみた - kmizuの日記
    coppieee
    coppieee 2009/07/18
    かっこいい
  • 1