Lambdaカクテル

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

scala

Perlのqw()みたいなやつがScalaにも欲しいので作った

追記2: ライブラリ化した。Mavenにpublishする手続きをちびちびやっている。 github.com 追記: 実装おかしかったのでちょっと修正した Perlにはqw()という文字列のリストを構築するための便利な構文があって、以下の表現は等価だ: ("foo", "bar", "buzz", "q…

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のforeverMのMはモナドのM

Cats Effectには、foreverMという >> を無限に繰り返すことと等価なメソッドがある: import scala.concurrent.duration._ import scala.language.postfixOps val wait = 100 milliseconds def indicator: IO[Unit] = IO.sleep(wait) >> (IO.print("\r|") >> …

CirceでShapelessのHListとJSONとを相互変換するにはcirce.shapesを使うとよい

Circeというライブラリがある。ScalaでJSONまわりの変換とかをやってくれるライブラリだ。 circe.github.io dev.classmethod.jp 他方、Shapelessというライブラリがある。ScalaでHeterogeneous List、つまりリストなんだけど異なるデータ型を含むリストを扱…

Cats Effect 3のDeferredでGoroutine / channelっぽいことをする

GolangにはGoroutineという良いやつがある。非同期処理をいい感じにやってくれる賢い軽量スレッドだよ。 go-tour-jp.appspot.com そして、Goroutine同士はchannelという概念を通じて会話することができる。 go-tour-jp.appspot.com 他方、Scalaの非同期処理…

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

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

K-means法でドット絵を作る記事が面白かったのでScala.jsで真似てみた

こういう記事を見た。 zenn.dev これは非常に面白かった。特に、寿司の画像が面白かった。そこで、自分も同じように寿司の画像をドット絵にしてみたいと思い、真似することにした。 ただ真似するだけではつまらないので、Scalaで関数型っぽくスマートに実装…

Recursion SchemeについてScalaのDrosteで勉強する(むずかしい理論はガン無視する)

前回、ドドスコ問題を解いた。 blog.3qe.us 記事ではRecursion Scheme自体の話題や、各構成要素の子細には立ち入らなかったため、Recursion Schemeを理解するためには不十分だった。そこでこの記事では、再帰的な構造、FixとPattern Functorとの関係、Recurs…

Recursion Schemeによるドドスコ問題の恐るべき解法

さる8月1日、計算機科学の根幹を揺るがすドドスコ問題が出題され、エンジニアたちは震撼した(意味: 面白問題が出たので、なるべくヘンテコな解法を使って己の技巧を誇示するためにエンジニアたちは競ってコードを書きはじめた)。 【問題】配列{"ドド","ス…

EmacsによるScala開発 2022年版 (補完編)

最近ちまちまEmacsでScalaを書けるようにしているのですが、そのメモ的な記事です。特に、補完の話に注目して書きます。 補完 じゃあどうすればいいの 相性の悪いプラグイン 参考elisp 01_company.el 02_lsp.el 03_scala.el 補完 補完を行うためには、まずは…

Shapelessの勉強(その4)

今日は、これまでに学習してきた Genericを拡張した LabelledGenericについて学習していく。これによって、型レベルでフィールド名や型名を扱う事ができるようになり、Shapeless が扱える処理の範囲がさらに広がる。 前回はこちら。 blog.3qe.us Literal typ…

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

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

ScalaTestでテストをIgnoreする方法いろいろ

開発していると、「テストが落ちるけど一時的にマージしたいからテストを通したい」ということがたまにある。そういうときにScalaTestではどうするのかについて調べてみた。 テストスイートごとignoreする 個々のテストをignoreする AnyFlatSpecを使っている…

(追記あり)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…

(Scala) MetalsのWorksheet気持ち良すぎだろ!

みんなScala書いてる?ScalaはJVM言語なのでコンパイルが当然必要なのと、sbtを起動するのがちょっと面倒で試行錯誤が大変なんだよね。 Scastieっていう便利なオンラインREPLもあるんだけど、もちろんちょっと時間がかかるし、IDEじゃないから補完とか効かな…

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

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

Monocleというライブラリについて軽く調べたメモ

最近は Scala 周りのライブラリをよく勉強していて、ShapelessやCatsについて勉強する事が多い。 ところでMonocleというライブラリも気になっていたので、Shapelessの勉強の息抜きに軽く調べることにした。 Monocleとは Monocleをインストールする Monocleの…

Shapelessの勉強(その3)

今回はChapter 4を扱う。 Working with types and implicits と題したこの章では、依存型と呼ばれる便利な概念を導入し、これまで説明してきたHList等の概念にさらに柔軟性を与える。 前回はこれ。 blog.3qe.us 用語についての説明 依存型 依存型の有無によ…

Shapelessの勉強(その2)

Shapelessの勉強をしていて、これは2日目の備忘録。教科書は、The Type Astronaut’s Guide to Shapeless。 1日目はこれ blog.3qe.us 前回は、Chapter 2まで進み、GenericとHList、Coproductについて学んだ。 復習 Shapelessが用意している型クラスのイディオ…

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

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

Shapelessの勉強(その1)

ScalaにはShapelessというジェネリックプログラミングを推進するためのライブラリがあって、同じ型の構造を持つCase Class間を変換するといった操作ができるのだけれど、あまり詳しいことは知らなかったので、公式のガイドブックを読んで勉強することにした…

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…

変数名に🤔絵文字💀を使いたい🤓

プログラミングをしていると、この変数はOptionだから、時としてNoneであるよ、と名前で表現したくなることがしばしばある。型システムが強力なので勝手にOptionであることはマウスをかざせば分かるけれど、一瞥して分かるほうが読む側としてはありがたいは…

ScalaTestでテーブルテストをやりたかったらforAllを使うといいぞ

こういう感じで書けます。 import org.scalatest.prop.TableDrivenPropertyChecks import org.scalatest.funspec.AnyFunSpec // 必要なのは TableDrivenPropertyChecks なので、あとは好きなstyleを選んでよい class FooSpec extends AnyFunSpec with TableD…

無名クラス中でそれ自身の型を表現するにはthis.typeと書く

無名クラスのunapplyを書きたかった。 val foo = new { // ... def unapply(it: /* ここに自分自身の型 */) = Some(...) } でもこういうときって自分自身の型をどう表現すればよいの!?と思って職場でうなっていたところ、 id:tarao さんが助けてくれた。解…

Scala+Sangria+Akkaで書かれたGraphQLのsubscription実装が面白いので分かった範囲で紹介する

しょうもなグラムというパロディSNSを作っている。キラキラした投稿ではなく、しょうもない投稿を褒め称えていくというコンセプトのSNSで、「いいね」ボタンの代わりに「しょうもな」ボタンがある。ハートマークではなく、ウンコのマークになっている。 まあ…

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