お前も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
を付けなかったら、そのメンバーは静的にコンパイルされます。
使いどころは?
- .NETが絡む
- その判別共用体の中で引数をとらない識別子が一つのみ
- nullにしてもよいと思った場合
これがそろったら使うか…? くらいの認識です。 ぶっちゃけ使うことはないだろうと思っています。
気を付けるべきとき
自分は使わないとはいえ、どのライブラリも使わないということは言えないので、対処してあげる必要があったりします。
ぱっと思いつく罠にはまるパターンはPretty Printerですね。
あとは box
したときにやらかしそうとかですかね。
結論
使うな。だが注意せよ。
追記
こうしてnullに表現可能になった識別子は、コンパイルしたらUnchecked.defaultof
でnullではなく代わりにunion caseのほうが使われるみたいですね。
F# Interactiveではnullが返ってきたので、コンパイラが色々やっている模様。
GitBookを出力するためのFAKE拡張の試作品を作った #FsAdvent
この記事はF# Advent Calendar 2015の30日目の記事です。
最近はやりのあの子
最近GitBookが流行っぽいですね。
そんでもって、Scala界隈では下記リポジトリのようにtut + GitBookでいい感じにコンパイルチェックもできるような感じのようです。
xuwei-k/gitbook-sample · GitHub
これ、F# でもやりたいですね?
そして F# 界隈には FAKE と FSharp.Formatting がありますね?
よろしい、ならば連携だ。
FAKE.GitBook
pocketberserker/FAKE.GitBook · GitHub
FSharp.FormattingにはMarkdown出力がない*1ので、GitBook用のMarkdownを出力するようにします……と言えればかっこよかったのですが、まだ試作品なのでそこまでちゃんと動きません。
あと、現時点で既にわりと力尽きかけているので、本格的に使い方がコントリビューションお願いします…。
使い方
GitBookとの連携が前提になっているので、package.json
とbook.json
が必要です。
あとは FAKE と FAKE.GitBook をロードして以下のようにスクリプトを書きます。
open Fake Target "GenerateBook" (fun _ -> GitBook id (fun p -> { p with SrcDir = currentDirectory @@ "doc" }) Html ) RunTargetOrDefault "GenerateBook"
pdfやepubを出力したいなら、Htmlの部分をPdfやEPubにすればいいです。
終わりに
以上、年末恒例の進捗帳尻合わせ回でした。
*1:Markdown、方言すぎだからあっても困る
fsugjp/publicというGitter roomについて #FsAdvent
この記事はF# Advent Calendar 2015の28日目の記事です。
本日はfsugjp/publicというGitter roomについて書きます。 前にも書いたけど、もうちょっと詳しく。
どういう場所なのか
roomの説明部分には下記のように書かれています。
F#関連についてゆるふわ会話する場所です。初心者の質問も歓迎。
もうちょっと具体的(?)なことを書くと、
- 誰かが疑問を書き、誰かが答える(ヒントを出す)か一緒に悩む
- ライブラリやコンパイラ、VS拡張のissueを引っ張ってきて紹介する
- 雑談
質問に対するレスポンスはわりと早いですし、様々なジャンルの方がいらっしゃるので勉強になります。
これを機会に、ぜひroomで F# のことを尋ねてみてください。
F# 4.0で入った地味だけど嬉しい機能紹介 #FsAdvent
この記事はF# Advent Calendar 2015の26日目の記事です。
通常のアドベントカレンダーは25日までですが、F# 界隈では英語版が31日まで続けているのにあわせて31日くらいまでやるっぽいです。
4.0の変更一覧
下記のページを見るのがてっとり早いです。
F# 4.0 Status · Microsoft/visualfsharp Wiki · GitHub
重めの機能でデザインとか背景とかを知りたい場合は以下。
fsharp/FSharpLangDesign · GitHub
こっちはvNextの草案も含めるみたいですね。
地味だけどうれしい機能紹介
F# 4.0はF# 3.0の時と比べると地味に見える変更が多い印象ですが、着実に改善されています。 というわけで、今回は私が地味にうれしいと思った機能を簡単に紹介していきます。
nth
が非推奨になりitem
が追加
ListやSeqモジュールにはnth
関数がありましたが非推奨になり、代わりにitem
関数が追加されました。
nth
にはListとSeqで引数の順序が異なる(Listのほうがパイプライン演算子に優しくない引数順序だった)という問題がありましたが、無事統一できるようになった形です。
F# 4.0でnth
を使うと警告がでます。
VS 2015を使っているとnth
はインテリセンスで一覧に現れないので注意しましょう。
units of measureが型変換なしでprintfできるようになった
このページの例を見ればどういう挙動なのか一目でわかります。
クラスのオブジェクト生成を関数のように扱える
xs |> List.map Uri
こういうコードが書けるようになりました。
StructuredFormatDisplayAttributeで複数のプロパティを利用できる
以下のように書けるようになりました。
[<StructuredFormatDisplay("My name is {First} {Last}")>] type Person = { First: string Last: string }
今までであれば、別のプロパティをわざわざ(型よってはこれだけのために)追加しなければならなかったので、楽になりますね。
isNull
関数の追加
.NETライブラリをラップするときになんだかんだお世話になりそうです。 あとstringでもお世話になってます。
終わりに
ところで、色々なライブラリはいつのタイミングで4.0に移行するのでしょうかね…?
TypeProviderでコンピュテーション式用の型を生成してみた #FsAdvent
この記事はF# Advent Calendar 2015の25日目の記事です。
TypeProviderを使う
今までチュートリアルくらいしかTypeProviderは作ったことはなかったのですが、ようやく重い腰をあげて使うことにしました。
型プロバイダー(TypeProvider)のちょっとしたアレコレ - Bug Catharsis
ぜくるお兄さんの記事、とても参考になるので何回も読み直してます。
コンピュテーション式とTypeProvider
コンピュテーション式のビルダーは単なる型なので、TypeProviderの対象にできますね?
というわけで今回は、以下のことをやってみようということに。
MonadBuilderTypeProvider構想
— ふ''れいす (@bleis) 2014, 7月 30
モジュール名を渡すと、そのモジュールにbindやらreturnやらが定義されていた場合にそれを引っ張ってきてビルダークラスを作るようなTypeProvider
— ふ''れいす (@bleis) 2014, 7月 30
これ一年半くらい前の発言なのですね…。
結論
できなくはないけど、できることが限られていてつらいorz
このリポジトリのコードを読んでいただけるとわかると思うのですが、Generic MethodがTypeProviderで生成できない関係で単一の型でしかbindできなかったり、その関係でdo!
が使えなかったりと、少なくともMonadTypeProviderみたいな汎用的なものは厳しい印象です。
逆に考えると、ジェネリックさえからませなければわりとやりたい放題できるということがわかったので、なんか色々と模索したいところです。
当分はカスタムオペレータの方向で模索してみます。
最近使っているScalaのライブラリ
これは Scala Advent Calendar 2015(アドベンター版) の4日目です。
3日目は、xuweiさんの ScalaからScalaPBというsbt plugin使ってProtocol Bufferを使う方法についてのドキュメントを書いている でした。 Protocol Buffer使ってみようかな…。
言い訳フェーズ
scalajp/publicというGitterのチャンネルで参加者を募っていたので軽い気持ちで参加したものの、ついこの間ネタを放出したばかりだったので思いつかなかった。
苦し紛れ…。
紹介フェーズ
注意事項は以下となります。
- この記事を書いた存在はScalaを普段使いしているわけではない
- 自作ライブラリは除外
Scalaz
- 前提
- 特に猫に移行する理由がないのでこっちを使っている
Shapeless
- 他のライブラリとともに勝手についてくることが多い
- 最近ようやく使い方がわかってきた、かもしれない
- Scala.jsをサポートしている
scalaprops
- 便利
scalacheck
- scalapropsがリリースされる以前に作ったものはこっちでチェックしているので現役
- Scala.jsをサポートしている
scalatest
- 最近はscalapropsで完結するものばかり書いているのでなんともいえない
- DiagrammedAssertions(power assert)は使いどころによっては便利
httpz
- べんきょーとか思って使っていたら慣れた
- 慣れると便利…かもしれない?
http4s
- 実装を読んでみるとなるほどなーという気分になる
- 最近は破壊的変更が以前よりも減った気がする
- 猫に移行するのか見守る
- プロジェクト頓挫しないよね…?
blaze
- http4sのついでに使っている
- なんとなく使っているだけで特に理由があるわけでもない
構文解析系
- その時々で気になったものを使っている
Argonaut
- httpzがこれに依存しているのでこっちを使っている
twirl
- まぁ、こっちでいいかなって
doobie
- 学ぶ目的
scodec-bits
- バイナリ操作はこれ以外の方法はあまり知らなかったりする…
scodec
- バイナリ構文解析の鉄板だと思う
gatling系
- 代替がない?
まとめ
- 仕事でないなら好みで選べば良いと思います
- 仕事なら周りにあわせそう
- なおこの記事を書いている時点でScalaを仕事で使ったことはない
SmlSharpContribについて
これはML Advent Calendar 2015と関数プログラミングAdvent Calendar 2015の一日目の記事です。
えすえむえるしゃーぷって?
関数プログラミング交流会で調査した感じだと、知っている人は増えつつあるがユーザはまだそんなにといったところなのかもしれません。
SmlSharpContribとは
ざっくりいうと「準標準パッーケージを作ろう」みたいな感じでしょうか。
- データ構造
- 便利関数
- エンコーダデコーダ
が現状で提供されている機能です。
「え、その型すら標準にないの?」などと言ってはいけません。
ライブラリを作るという話になった経緯
2015年の2月頃に、大阪の知り合いが仕事の都合で名古屋に来るということで何名かでご飯を食べに行きました。 そこでなぜか(話の流れは忘れた)みずなんとかさんとぶれなんとかさんが「SML#の準標準ライブラリが欲しい」と言い出し、何人かを巻き込む形で始動しました。
なんか開発止まってるようにみえるけど…
みなさんお忙しいですからね、決して興味がなくなったとかいうわけではないはず…ええきっと。
もみあげはなにをしたの?
パーサコンビネータ、JSONパーサなどを作ってました。 XMLパーサも実装しようとしていましたが体力切れで絶賛放置中…。
おわりに
SML#は楽しい(はずな)ので、みなさんもSmlSharpContribに貢献するという形でSML#を触ってみませんか?