お前もnullにしてやろうか! #FsAdvent

この記事はF# Advent Calendar 2015の31日目の記事です。

ガス欠なので役に立たないネタでお茶を濁します。

Noneはnullと解釈できる

F#erの皆様はたいていprintf "%A" Noneを実行して<null>と表示されることに落胆したことがあるのではないでしょうか。 私は落胆しました。

同じようなことをやってみる

[<CompilationRepresentation(CompilationRepresentationFlags.UseNullAsTrueValue)>]
type A<'T> = B | C of 'T
with
  [<CompilationRepresentation(CompilationRepresentationFlags.Instance)>]
  member this.Value = match this with | C a -> a | B -> failwith "oops!

CompilationRepresentationFlags.UseNullAsTrueValueを指定することで、引数をとらない識別子をnullとして表現可能になります。 こいつを付けた状態でメンバーにCompilationRepresentationFlags.Instanceを付けなかったら、そのメンバーは静的にコンパイルされます。

使いどころは?

  1. .NETが絡む
  2. その判別共用体の中で引数をとらない識別子が一つのみ
  3. nullにしてもよいと思った場合

これがそろったら使うか…? くらいの認識です。 ぶっちゃけ使うことはないだろうと思っています。

気を付けるべきとき

自分は使わないとはいえ、どのライブラリも使わないということは言えないので、対処してあげる必要があったりします。

ぱっと思いつく罠にはまるパターンはPretty Printerですね。

あとは box したときにやらかしそうとかですかね。

結論

使うな。だが注意せよ。

追記

こうしてnullに表現可能になった識別子は、コンパイルしたらUnchecked.defaultofでnullではなく代わりにunion caseのほうが使われるみたいですね。 F# Interactiveではnullが返ってきたので、コンパイラが色々やっている模様。

2015年簡易振り返り

書いておかないと忘れるけどもう時間がないので簡易版。

生活

  • F# MVPから.NET MVPになった
    • MVPらしい活動をしていたかどうかは微妙なところだが、なんかやってはいた気がする
  • 転職した
    • 転職の際にScalaMatsuriの情報を使わせてもらったお礼にと思ってインタビューを受けたが、インタビューを受けるのはこれが初だったのでわりと緊張した
    • やはり東京にいると便利だなと思うことが多い
    • しかし地元九州からさらに遠ざかってしまった…移動が面倒だったので今年は帰省していない
  • 生活時間が順調に狂った
    • ただし、転職以前に感じていた寝起きのつらさ的なストレスが消えたのでこれはこれで良かったのかもしれない
  • 年末になってようやく引っ越し貧乏から脱出しつつある
  • ゲームはコンスタントに買って消化していた気がする
    • 去年からの積みゲーがそのままになっている問題…
  • なんだかんだひと月一記事以上ブログ書いてたらしい

言語

  • F#: ほぼプライベートオンリーだけどなぜかわりと触ってた
  • Scala: ほぼプライベートオンリーだけど(ry
  • TypeScript: 諸事情で手を出した
  • Elixir: 諸事情で手を出した
  • Erlang: ちょっとだけ書いたけど思った以上に書かなかった
  • SML#: なぜか一時期書いてた
  • C++: 諸事情で書いた
  • Rust: nomを触るためにちょっと学んだ
  • Haskell: 読む力は上がったが一切書いた記憶がない

Rustを本腰入れてやりたい気もしつつ、Idrisに挑戦したい気もしつつ、Coqから目を背けないほうがいいのか…色々考えても結局なるようにしかならないので考えるのをやめよう。 来年のことは来年の私が頑張ってくれるはずだ。

ライブラリは産廃なものと形になったもので半々といったところ。 まぁ、使うことを目的としていないのでこんなものではないだろうか。

イベントとか

会社のセミナールームが使えることに味を占めて色々開催したりお手伝いしていた気がする。

  • Lens & Prism
  • F#談話室(これは一回会場手配しただけだけど
  • 関数型Scalaの集い
  • 関数プログラミング交流会
  • Testing Framework Meeting
  • 関数型ストリーム処理勉強会(これは相談を受けて開催したやつ)
  • Oleg勉強会

個人的には、知らないことが何か知れたという点で非常に満足度の高いものだった。

あと、なんだかんだで発表していたようだ。

ペースは落ちるかもしれないが、何回かは発表したいところだ。

.NET系の勉強会に顔を出したいと思いつつなかなか足を運べていないのでなんとかしたい。

締め

気の向くままに。