それほど色々試したわけではないけど、数日前に良さそうなやつが登場したので貼っておく
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のとても有名な人が以下のように言ってるので
@peterseibel `optparse-applicative` is good: URL . It's featureful, heavily used, and has nice algebraic properties
ちゃんとScalaに移植されているなら、現状でこれが最も関数型なコマンドラインオプション解析ライブラリでオススメだと思う。*1
現状ではテストがほとんどない?のと、もとのHaskellのライブラリにあるBashCompletionの機能とか移植されてない?
https://github.com/pcapriotti/optparse-applicative/blob/0.10.0/Options/Applicative/BashCompletion.hs
ので、気が向いたらそのあたりやってみたい。(もしくは誰かやりましょう)
ちなみに、よこたさんがメンテしてるscopt
あのコード量の少なさとかシンプルさの割にある程度は宣言的に書けるとか型クラス使ってるとか、悪くないとは思うのだけれども、optionalメソッドの呼び出しが型に反映されない?*2とか個人的に一部不満があって、scala-optparse-applicativeの作者の人も以下のように
Is there a Scala option parser that achieves both:- separating parser from data structure;- type safety?Already tried scallop and scopt.
すでにscopt試してそれでも不満があったので作ったようなので、scoptよりもいいのでは?という予感はしている。
が、まだ実際色々試したわけではないし、scala-optparse-applicativeは作成されたばかりなので、予想外のバグとか注意が必要かもしれない
追記:
scoptのサンプルコードを少し移植してみた
https://github.com/xuwei-k/scala-optparse-applicative/commit/22232f3a42bec2a9fd7962