Lambdaカクテル

京都在住Webエンジニアの日記です

cats

Haskellのguard/<$のコンボはCatsではasを使う

覚えておきたいのでメモ。 x <$ guard (y == z) こういう式をCatsで表現したいとき、Catsには<$も$>も、そのままの演算子では存在しない。そのかわり、Catsにはasという名前で同等のメソッドがある。 typelevel.org F[A] => B => F[B] as つまりこういう感じ…

おい少年、g(x)(f(x))になるパターンはScalaのCatsでg <*> fにできるぜ

tl;dr g(x)(f(x)) === g <*> f 共通の引数を持つ1引数関数たちはReaderとして合成可能であり、ReaderがApplicativeのインスタンスであることを利用している 本編 おい少年と呼び掛けてみたものの、関数型女子高生がいるかもしれないよね。それはさておき、 …

Cats Effectでダウンロードインジケータを表示する

Scalaの非同期処理まわりのハンドリングをやりやすくするライブラリ、Cats Effectの教科書を読んでいる。 essentialeffects.dev 英語は平易で分かりやすいので、諸君もぜひ読んでほしい。 そんな中、Cats Effectの機能の一つであるResourceの面白い応用を思…

型付きのタスク同士の依存関係を解決するソルバは書けるのか その1

こういう話題: 今日 @yigarashi_9 と会話してて、「相互に依存し合ったタスクの集合からグワッとDAGを生成してトポロジカルソートして一つずつ解決していくみたいなパターンあるよね」みたいな話をしたけど、なんか名前あったっけみたいなモヤモヤが、ずっと…

(追記あり)CatsでReaderになるfunctionをいい感じに合成したいけど微妙

tl;dr (f, g) mapN (_ compose _) しましょう f -> g mapN (_ <<< _)って書くとちょっとかっこいい つづき 最近ずっとCatsの記事を書いているな…… 先日、(->) r がApplicativeになるという話をした。 blog.3qe.us んで、この(->) rが2つあるときに、これらを…

(追記あり)ScalaのMapをmapしてkeyが衝突するのを回避する方法

MathJax = { tex: {inlineMath: [['$', '$'], ['\\(', '\\)']]} }; ScalaにはMapというデータ構造があり、辞書を表現している。 val m = Map("windy" -> "melt", "fizz" -> "buzz") m("windy") // => "melt" そして、Mapにはmapメソッドが生えていて、KeyとV…

(追記あり)List[Monoid]同士を垂直結合させるためにMonoidを作る必要はなかった・・・

モノイドからなるリストのリストを垂直に結合したい。 tl;dr 「ZipListってのがあるよ」 順にやってみる Parallel登場 追記 まずは下準備: import cats._ import cats.implicits._ // こいつらをぜんぶくっつけたい val xs = (1 to 9).toList // xs: List[In…

List[Monoid]同士を垂直結合させるようなMonoidが欲しいので作った

追記: 解決編から見よう blog.3qe.us 最近型クラスまわりで遊んでいて、ちまちま応用例を見付けられているので嬉しい。 今回は、モノイドのリスト同士を結合することについて考えていきたい。 まずは下準備: import cats._ import cats.implicits._ val xs =…

Catsを使ってReader関手・Reader Applicative関手を勉強したよ

先日、Haskellで書かれたおもしろFizzBuzzの事を思い出した。読んだときはよく分からなかったけれど、型クラスへの理解が進んで、結構意味が分かるようになりつつある。そこで、それにまつわる要素をちゃんと勉強することにした。勉強といってもCatsでの使い…

ScalaのCatsのAlternativeチョットワカル

Scalaの関数型ライブラリ(?)であるCatsには色々な型クラスが実装されていて、だいたい良く使うのはMonoidとかMonoidKとかApplicativeとかなんだけど、その昔関数型FizzBuzzのことを考えていたときにAlternativeが使われていて、そのことがずっと気になって…

Noneは空文字に写したい、そんな君のためにcombineAllがある

Scalaをやっていて、val x: Option[String] = Noneを""に写したいことが100万回くらいある。しかしx.getOrElse("")と書くのは納得いかない、という状況になっていた。 なぜかというと、Stringはモノイドだし、モノイドには空要素emptyがあるはずで、Option[A…

CatsでFizzBuzzする

以下の記事を参考にCatsでも頑張ってみたけど、途中までしかできなかった・・・。 itchyny.hatenablog.com import cats._ import cats.implicits._ import cats.data._ implicit val F = Monoid[Option[String]] implicit val Al = Alternative[Option] val …

Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?