独学大学情報学部

ただのノート。主にプログラミング。

MonocleのapplyLensメソッドの使い方

去年末くらいからぼちぼち触り始めてたけど今更知った。

使い方

例えばこんな感じのデータ構造(とLens)が定義されてるとして、*1

@Lenses case class Address(street: String, postalCode: String)
@Lenses case class User(name: String, age: Int, address: Address)

Lensを合成していってgetしたり、modifyしたりするわけですが、

import monocle.syntax.apply._
import Address._, User._ // 生成されたLensの為に

val me = User("Aoino", 24, Address("street", "xxx-xxxx"))

scala> address composeLens street get me
res1: String = street

// ^|-> はcomposeLensのエイリアスメソッド
scala> (address ^|-> street).modify(_.capitalize)(me)
res8: User = User(Aoino,24,Address(Street,xxx-xxxx))

applyLensを使うと以下のようにかけます。

scala> me applyLens address composeLens street get
res13: String = street

// &|-> applyLensのエイリアスメソッド
scala> me &|-> address ^|-> street modify(_.capitalize)
res16: User = User(Aoino,24,Address(Street,xxx-xxxx))

使わなかった時よりも若干見やすく、流れるようなインターフェース感()が増しましたね。おつおつ。

実装

単純に暗黙的変換でメソッドが追加されてる(ように見える)だけです。

https://github.com/julien-truffaut/Monocle/blob/v1.1.1/core/src/main/scala/monocle/syntax/Apply.scala#L10-L19

ちなみに

タイトルにはapplyLensって書いてますが、ほかにも以下のメソッド共が存在します。

method aliase
applyTraversal &|->>
applyOptional &|-?
applyPrism &<-?
applyLens &|->
applyIso &<->

で、一応composeXXXもまとめると

method aliase
composeTraversal ^|->>
composeOptional ^|-?
composePrism ^<-?
composeLens ^|->
composeIso ^<->

初見は「はぁ???」ってなりますが、composeと一緒に眺めると&か^の違いしかないので、覚えるのはそんなに苦労しないんじゃないかと。*2

まとめ

ってなわけで、これでますますScalaでLens欲が高まりますね!!

*1:マクロアノテーションの力により、コンパニオンオブジェクト内にcase classで定義されてるフィールド名と同名のLensが定義されます。詳しくはこちら

*2:とはいえ、右手onlyで打つ記号共なので逆に打ちにくいっていう

Lens&Prism勉強会でMonocleについて発表してきた

とっても今更なのだけど、記録として。

connpass.com

↑にLT枠で参加してきた。

資料は

www.slideshare.net

色々あって、前半部分参加できなかったのだけれど、TL眺める限りとても濃い話だったっぽいので、ちょっと残念。

http://togetter.com/li/828498

当日は予想以上の人で、緊張のため話そうと思ってたこと半分くらい飛んじゃって、テンパって足プルプルしてたけど、まぁなんとかなって良かった。

今回の発表内容は「理論はよく分からないけど、使い方分かってきたから実践で使ってみた」的な話だったので、もし次回があるのなら今度は理論的な話とかもできるようになりたいなーとか思ってます。

当日の準備、懇親会、片付けに一切参加できずですんませんでした、、、
また機会があれば、今度こそお手伝いできればと!

みなさんお疲れ様でした!ありがとうございました!!

「Scala勉強会第143回 SPECIAL DAY ハッカソン in 歌舞伎座」に参加してきた

今日は ↓ に参加してきました。
http://rpscala.doorkeeper.jp/events/20374

一番後ろの席に座ってたので人数数えてみると、ざっと30人弱くらいでした。
各々自己紹介の後、ハッカソンスタート。

今日やったこと

スライド作るの面倒だった時間なかったので、発表内容もここでまとめます。

↓今日はこれの開発してました。
https://github.com/aoiroaoino/connpasscala

ざっくり言うとConnpassってイベント支援サービスのAPIクライアント for Scalaです。既に返ってきたJsonをパースする部分は作っていたので、今回はHTTPリクエスト投げる部分+αを実装しました。 HTTPリクエストにはscalaj-httpJsonのパースにはargonautを使用しています。 特にこだわりがあったわけではなく、単純に使った事なかったので試したかったってのが理由。

使い方は以下のような感じです。(2015/02/12 現在)

scala> import connpasscala._, Connpasscala._
import connpasscala._
import Connpasscala._

scala> :paste
// Entering paste mode (ctrl-D to finish)

Client()
  .keyword("scala")
  .ownerNickname("AoiroAoino")
  .run()

// Exiting paste mode, now interpreting.

res0: Option[connpasscala.Response.Connpass] =
Some(Connpass(1,1,1,List(Event(10643,Scalive # 1.414 @ 西麻布ベース,Scalaなどについて語らいながら1.414人前の肉を喰らう@西麻布ベース,<h3>▼趣旨</h3>
<p>前回のScalive!<br>
...

scala> val event = res0.get.events.head
event: connpasscala.Response.Connpass.Event =
Event(10643,Scalive # 1.414 @ 西麻布ベース,Scalaなどについて語らいながら1.414人前の肉を喰らう@西麻布ベース,<h3>▼趣旨</h3>
...

scala> event.title
res2: String = Scalive # 1.414 @ 西麻布ベース

scala> event.hashTag
res3: String = scalive

基本的にはConnpass API仕様の検索クエリのキャメルケース名メソッドで検索条件を追加していって、run()で実行後、レスポンスフィールド名のキャメルケース名メソッドでデータにアクセスする感じです。

とりあえず動いている状態ですけど、エラー処理皆無だったりパッケージ構成変だったりテスト書いてないし依存関係切り分け出来てないし、etc...と、実用には程遠い状態orz ただまぁ、折角の(それなりに使えそうな?)初ライブラリなので、CIやらバージョン管理やらMaven Centra Repositoryへの公開やら、一通り試してみたいですね。

感想

今回は久しぶりのハッカソン参加かつ、進捗ダメじゃなくて発表まで行けたので良かった!!でもやっぱりスライドは作るべき。。なんとなく伝えきれなかった感ある。。。

(´-`).。oO(なんとか時間内に使える状態になって良かった...)

まとめ

主催のみなさん、参加者のみなさん、お疲れさまでした!ありがとうございました!    

Scalive#1.414 お疲れ様でした!

先日の土曜日にScalive#1.414が開催されました!

とてもオシャレな会場で生ビール片手に生ハムつまみながらLT大会を実施!
お酒に酔っていても推しメンとScalaを語る眼差しは真剣でした!(個人的視点

以下、生ハム原木があられもない姿になっていく様子です。ご査収ください。

f:id:Aoino:20150124152515j:plain

f:id:Aoino:20150124154702j:plain

f:id:Aoino:20150124202103j:plain


(´-`).。oO(5kgの生ハム、予想に反してまさかの完食)


せっかくなのでLTしました

ScalaとPlayの社内勉強会やってみた的な話しました。

で、本題は社内勉強会で作った資料をベースにScala/Play Framework初心者向けのチュートリアルを作って公開しましたって話です。まだちょっと荒い部分があるんですが、以下のGitHubアカウントで公開/管理してますのでよかったらどうぞ!

mvrck-inc/tutorial-scala-play · GitHub


最後に

会場を貸して下さったラフノートさん、そして参加者の皆さん、本当に楽しい時間をありがとうございました!次回のScaliveもお楽しみに!!



追記:
当日「なんでScalaと生ハム原木なんや!関係ないやろ!」ってツッコミを頂きました。

f:id:Aoino:20150124155003j:plain

実は生ハム原木を固定する台座にScalaって呼ばれる種類があるんですよ!(後付け
ちなみに、今回使用していたのは右下のBANQUETAでした!







 _人人人人人人人人人人人人_
 > やっぱり関係なかった <
  ̄ YYYYYYYYYYYYYYYY ̄

2014年を振り返って

2014年を振り返って

個人的な振り返りです。
特に面白い内容はありません!!

記事

今年書いたのはScala Advent Calendar 2014 - Qiitaの12/22の記事一本でした。

http://aoino.hatenablog.com/entry/2014/12/23/050932 書きたいネタは山ほどあったので、あとは記事を書く気力とまとめ能力ですね…きっと...

イベント

参加したイベントは(覚えてる範囲で)以下です。

参加したはいいものの、内容まとめやレポートを全然書けてないのでその辺も頑張りたいですね。アウトプット大事。

オープンソース

fix typo以外で初めてPull Request出しました!マージされました!

https://github.com/argonaut-io/argonaut/pull/154

前述のアドベントカレンダーネタでMonocle触ってる時にargonautの内部で古いバージョン使われてるの発見して出してみました。次の日起きたらMonocleの新バージョン出ててびっくりしたのはいい思い出。あと、英語力が…もっと…欲しい...

お仕事

新卒(相当)で入社した前職でしたが、11月一杯で退職しました。
昨年4月から数えて1年8ヶ月という非常に短い期間でしたが、どうしてもScalaでお仕事したかったのが理由です。 前職でとてもよくして頂いていただけに、お世話になった方々には感謝しても感謝しきれません。 本当にありがとうございました。

12月からは新しい場所でScala書いて頑張ってます!!

それなりには読んだ気がします。たぶん。
前半は主に言語とか情報工学系な内容の本で、後半はWeb系システムに関する本が多かったと思います。 帰省中なので、あとでタイトルはまとめようと思います。。。

来年の抱負

来年は主に英語とオープンソース活動に力を入れてみたいと思います。 きっと他に興味もったりするかもしれませんけれど、総じて楽しめればいいかなーって感じで。

あとは、やっとモナモナした話が分かってきた感じもするので来年度も引き続き関数型言語どっぷりな方針で頑張りたいです!

まとめ

今年も大変お世話になりました。来年もどうぞ宜しくお願い致します!
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌