Scalaにおいて一番関数型というかHaskellっぽいコマンドラインオプション解析のライブラリ

それほど色々試したわけではないけど、数日前に良さそうなやつが登場したので貼っておく


https://github.com/bmjames/scala-optparse-applicative

ソースコードは大雑把に読んだけど、ひたすらMonadとかApplicativeとかMonoidとかEndoとかStateTとかReaderTとか、色々とScalazの機能が使われていて、いい感じでした。ライブラリ使わなくても、Scalazの勉強にソース読むという用途でもいいかもしれません。


stack overflowにも「Scala: Best way to parse command-line parameters (CLI)?」という人気の質問あるのだけど、今更ながら回答しておいた。(+1してくれ)

http://stackoverflow.com/a/26125125/605582

ライブラリ自体は、HaskellやScalaz詳しい人が、Haskellのライブラリを移植したものです。

移植元のHaskellライブラリに関しても、Haskellのとても有名な人が以下のように言ってるので

ちゃんとScalaに移植されているなら、現状でこれが最も関数型なコマンドラインオプション解析ライブラリでオススメだと思う。*1

現状ではテストがほとんどない?のと、もとのHaskellのライブラリにあるBashCompletionの機能とか移植されてない?

https://github.com/pcapriotti/optparse-applicative/blob/0.10.0/Options/Applicative/BashCompletion.hs

ので、気が向いたらそのあたりやってみたい。(もしくは誰かやりましょう)



ちなみに、よこたさんがメンテしてるscopt

あのコード量の少なさとかシンプルさの割にある程度は宣言的に書けるとか型クラス使ってるとか、悪くないとは思うのだけれども、optionalメソッドの呼び出しが型に反映されない?*2とか個人的に一部不満があって、scala-optparse-applicativeの作者の人も以下のように

すでにscopt試してそれでも不満があったので作ったようなので、scoptよりもいいのでは?という予感はしている。
が、まだ実際色々試したわけではないし、scala-optparse-applicativeは作成されたばかりなので、予想外のバグとか注意が必要かもしれない



追記:

scoptのサンプルコードを少し移植してみた
https://github.com/xuwei-k/scala-optparse-applicative/commit/22232f3a42bec2a9fd7962

*1:もちろんScalaz大量に使われるので、Scalaz苦手な人はやめたほうがいいかもしれません?

*2:その部分に関して厳密な型安全諦めてる?