Haskell

また久々にHaskellでプログラムを書いて学んだこと

ここ最近、ある程度の規模のHaskellプログラムを書いた。またしてもOAuth2関連のWebアプリだが、OpenID Connectクライアント(relying party)と独立したAuthorization serverの2つのロールを兼ねる。 ここでは、今回プログラムを書いて学んだ雑多ことを書き留…

最近見かけたHaskellプログラム: cabal-plan-bounds

cabal-plan-bounds: Derives cabal bounds from build plans cabal-plan-boundsは.cabalファイルのbuild-dependsフィールドのパッケージバージョン範囲を自動生成するツール。実際のビルドで使われたビルドプラン(例えば dist/cache/plan.json としてcabalが…

最近見かけたHaskell library: unliftio-pool

unliftio-pool: Data.Pool generalized to MonadUnliftIO. unliftio-poolはresource-poolをMonadUnliftIOにgeneralizeしたバージョン。 resource-poolはその名の通りリソースプールの汎用実装。例えばデータベースコネクションなんかを蓄積しておいて、各ス…

レコードデータの一部のフィールドだけテストする

レコードデータ型の一部のフィールドだけテストする方法について、以前から少し悩んでいた。 data Person = Person { id :: Int , name :: Text , age :: Int } deriving (Eq, Ord, Show) registerPerson :: Text -> Int -> IO Person これをテストするため…

久々にHaskellでプログラムを書いて学んだこと (3): コーディングスタイルなど

コードフォーマット 最近はGo言語を書く機会もあり、そこでgo fmtいいなと思ったので、Haskellでもコードフォーマッタを導入することにした。 とりあえずstylish-haskellを使うことにした。Emacsで使うので、設定ファイルは自分のEmacs設定レポジトリに入れ…

久々にHaskellでプログラムを書いて学んだこと (2): 各種ライブラリについて

久々にそこそこのボリュームのHaskellプログラム(OpenID Connect認証つきの簡単なWebアプリ)を書いて学んだことの第2回。 ライブラリ 今回使った外部ライブラリについて。 Web application Web application frameworkとしてはservant-serverを使った。servan…

久々にHaskellでプログラム書いて学んだこと (1): 抽象化レイヤとモナドについて

最近、久々にそこそこのボリュームのHaskellプログラムを書いた。ぶっちゃけ簡単なWebアプリだが、OAuth2(というかOpenID Connect)によるログイン機能を盛り込み、バックグラウンドでAWSのサービスをいくつか扱う。 その開発でいろいろと思うところ、学んだ…

最近見かけたHaskell library: cache

cache: An in-memory key/value store with expiration support cacheはシンプルなin-memory key-value store. 内部実装としてHashMapを使っており、IOやSTMモナドによるinsert, lookupが可能。また、オプションでexpiration timeをセットすることもできる。…

GHC.Generics.Generic typeclassと実装隠蔽とGHC.Records.HasField typeclass

ここ最近、ちょっとHaskellを書く機会があり、Haskellにおける伝統的な課題「レコードフィールド名が広めの名前空間に飛び出るので衝突しまくる問題」をなんとかできないか考えている。 参考: 新しいGHC拡張、NoFieldSelectorsについて - モナドとわたしとコ…

最近見かけたHaskell library: acc

acc: Sequence optimized for monoidal construction and folding accはリストデータ構造Accを提供するライブラリ。Accの特徴はappendやprependが速い、ということ。ベンチマークによるとDListやSeqより速いとのこと。とにかくデータをリスト状に突っ込むよ…

最近見かけたHaskell library: forma

forma: Parse and validate forms in JSON format formaはWebアプリケーションにおけるform validator。formの送信内容はJSON形式で送信されることを想定している。

最近見かけたHaskell library: valida

valida: Simple applicative validation for product types, batteries included! validaはproduct type (レコードデータ型)に対するvalidation処理を書くためのライブラリ。validation処理はValidator型で表現される。 data Validator e inp a e: エラーを…

最近見かけたHaskell library: slugger

slugger: Clean URI slugs for Haskell sluggerは任意の文字列をURL-friendlyな文字列にそれっぽく変換するライブラリ。例えば import qualified Data.String.Slugger as SluggerString SluggerString.toSlug "Hey there, world!" -- "hey-there-world" Slug…

最近見かけたHaskell library: retry

retry: Retry combinators for monadic actions that may fail retryは任意のIOアクションをバックオフつきで再試行(リトライ)する仕組みを提供するライブラリ。RetryPolicy型(Monoidになっている)でどういった戦略でリトライをするかを設定し、retrying関数…

最近見かけたHaskell library: ttc

ttc: Textual Type Classes ttc(Textual Type Classes)は、Haskellの問題点として名高い「文字列型多すぎ問題」に対処するためのパッケージ。各種文字列型の間の相互変換のほか、Show/Read typeclassを各種文字列型にgenericに拡張したRender/Parse typeclas…

最近見かけたHaskell library: connections

connections: Orders, Galois connections, and lattices. connectionsはガロア接続 (Golois connections)を表現するライブラリ。ガロア接続の正確な定義はライブラリのドキュメントを参照されたいが、ある規則を満たす半順序集合間の2つの写像の組、らしい…

最近見かけたHaskell library: versions

versions: Types and parsers for software version numbers. versionsは様々なソフトウェアバージョン番号のデータ構造、パーサ、フォーマッタ(pretty printer)を提供するライブラリ。バージョン番号の形式としてはSemVerやHaskell PVPをサポートしているが…

最近見つけたHaskell library: fuzzyfind

fuzzyfind: Fuzzy text matching fuzzyfindは文字列のあいまい探索ライブラリ。基本的に、クエリ文字列がターゲット文字列に含まれるかどうか、含まれるとしたらどこかを探し出す。その際、クエリ文字列がバラバラにターゲット文字列に含まれる場合もマッチ…

最近見かけたHaskell library: clash-prelude

clash-prelude: CAES Language for Synchronous Hardware - Prelude library clash-preludeはハードウェア記述言語Clashのメインライブラリ。Clashは要するに、HaskellからVHDLなどのハードウェア記述言語プログラムを生成するコンパイラらしい。そんなもの…

GitHub ActionsでHaskellプロジェクトのstack/cabal混在CI

これまで自分が公開しているHaskellのライブラリのCIはTravis CIを使っていたが、GitHub Actionsに移行することにした。一番大きな理由は、haskell/actions/setupを使うと最新のghcとcabalを使ったビルドが比較的簡単に実現できるから。 これを機に、手元の…

最近見かけたHaskell library: invert

invert: Automatically generate a function's inverse invertは与えられた関数の逆関数を自動生成するライブラリ。もちろんどんな関数にも適用できるわけではないので使う際には注意が必要。対象の関数が単射(injective)か、全射(surjective)か、全単射(bij…

最近見かけたHaskell library: salve, witch

Taylor Fausak(@tfausak)さんによる2つ。 salve: Semantic version numbers and constraints. salveはsemantic version numberを表現するデータ構造及びそれらに関する処理(パーサ、フォーマッタなど)を提供するライブラリ。npmの表記によるversion constrai…

最近見かけたHaskellツール: ghc-vis

ghc-vis: Live visualization of data structures in GHCi The ghc-vis User Guide ghc-visはGHCiのプラグイン(?)で、指定した式がどのようなデータ構造になっているかをGUIで可視化する。どこにサンクがあったり、データ構造がどう相互参照しているかを見る…

最近見かけたHaskellプログラム: vgrep

vgrep: A pager for grep GitHub - fmthoma/vgrep: A pager for grep vgrepはgrep向けのpagerプログラム。grepコマンドでマッチした箇所をインタラクティブに閲覧して、マッチしたファイルのマッチした行でさらにpagerを開くことができる。 grepの結果をパイ…

cabal-install "v2" ビルド メモ

しばらく前からstackばかり使っていたのでCabalにはとんと疎くなってきたが、cabal-installの"v2"系のビルドはかなり使いやすくなっているとのことで、使い方をチェックしてみた。 stackの代わりにcabalを使うメリットとしては、以下が挙げられると思う。 st…

最近見かけたHaskell library: conferer

conferer: Configuration management library Conferer · Configure your Haskell programs Haskell applicationの設定データ(configuration)をロードするためのフレームワーク。コマンドラインオプション、環境変数、設定ファイルなど異なる情報源(source)…

最近見かけたHaskell library: webgear-server

webgear-server: Composable, type-safe library to build HTTP API servers WebGearはWeb (HTTP) API serverを作るためのライブラリ。server-sideのHandlerを組み立てて、Wai applicationを作る。 ドキュメント: WebGear リリースブログ: Haskell Explained…

Raspberry Pi 4でHaskellプログラムをビルドしたりDockerを使ったりする

共立プロダクツのRaspberry Pi 4スターターセットを買って試してみた。Micro SDカードにはRaspbian Buster (10.3)がプリインストールされている。 Haskellプログラムをビルドする Raspberry Pi 4でHaskellを使うことについては以下の記事がある。 Haskell on…

Haskellで書いたプログラムをRaspberry Piで動かす方法

Haskellで書いたプログラムをRaspberry Piで動かす方法に関して少し調べた。 Raspberry Pi上でHaskellプログラムをビルドする方法 Haskell on Raspberry PI 4 - Vaclav Svejcar personal blog LLVM関連パッケージとスワップサイズを増やすことに気をつければ…

.cabalファイルのパース

先日、staversionの新しいバージョンをリリースした。 staversion: What version is the package X in stackage lts-Y.ZZ? staversionはStackageやHackageに上がっているパッケージバージョンを調べるコマンドラインツール。今回のバージョンでは、.cabalフ…