タグ

ブックマーク / zenn.dev/autotaker (4)

  • モナドオリンピック1-トラック競技-

    はじめに 最速のモナドを決めるモナドオリンピックを開催することになりました。 この大会では、各ライブラリの提供するモナドたちが 様々な競技(ベンチマーク)に挑戦します。 競技説明 今回は副作用のないシンプルなベンチマークで計算速度を測ります。 ベンチマーク おなじみのfibをつかいます。普通のfibは返り値が整数型ですが、次の理由から偶奇を表すブール値にしています。 Int型にするとReaderモナドやIdentityモナドで返り値がUnboxingされて有利になりすぎる。 Integer型にすると演算にかかる時間が無視できない xor :: Bool -> Bool -> Bool xor True x = not x xor False x = x fib :: Monad m => Int -> m Bool fib = go where go n | n <= 1 = pure $

    モナドオリンピック1-トラック競技-
    igrep
    igrep 2021/03/16
    "bind演算子がインライン展開されないと5倍から40倍遅くなるため、Monad m制約がつく関数はINLINE(またはINLINABLE)プラグマを指定"
  • Haskellの最近の乱数生成事情について

    あらすじ Haskellでの乱数生成ライブラリは長らく群雄割拠の時代が続いていました。 その理由は、公式のrandomパッケージの使い勝手がすこぶる悪かったため、 各々が独自のインターフェースでまともな乱数生成ライブラリを公開していました。 その時代は、random-1.2の登場により終わりを迎えました。 これからはrandomパッケージを使えば基的に問題ないでしょう。 Before random-1.2 Haskellの公式の乱数生成ライブラリがrandomだったのですが、 このライブラリは System.Randomといういかにも標準的なモジュールを提供している割に使い物になりませんでした。 そのため、 mwc-random tf-random xorshift mersenne-random-pure64 などのライブラリが独自のインターフェースを提供していました。 randomの

    Haskellの最近の乱数生成事情について
  • HaskellでのTDDを楽しくするライブラリ methodを作りました。

    はじめに Haskellでテスト駆動開発を行う際、純粋な関数は単体テストを書きやすいですが、 返り値がモナドの関数(この記事ではそのような関数をメソッドと呼びます)にたいして単体テストを書くのは簡単ではありません。 今回、メソッドに対して単体テストを書きやすくなるライブラリ methodを作成しました。 methodとは methodでは a1 -> ... -> an -> m b型の関数のことをメソッドと呼びます。 ここでmはモナドです。(->) rモナドを除く大抵のモナドはサポートしていますが、独自のモナドをメソッドにするにはMethod型クラスを実装する必要があります。 モックの作成 methodでは任意のメソッドのモックをDSLで書くことができます。 import Test.Method import RIO (throwString) f,f' :: Int -> String

    HaskellでのTDDを楽しくするライブラリ methodを作りました。
  • おすすめHaskellプロジェクト作成方法(ほぼ)2021年版

    はじめに (あともう少しで)あけましておめでとうございます。 この記事では2020年12月31日時点での私のおすすめの最新のHaskellプロジェクトの作成方法をまとめます。 Haskellの環境構築はstackを使うものとcabalを使うものの2種類があります。 歴史的にはcabalの不便さを改善したのがstackですが、現在はcabalも進化して 不便さは大幅に解消されているため、筆者の好みでcabalによる環境構築をまとめます。 ツールのインストール ghcup ghcupはGHCとcabalとHLSをバージョン管理してくれるインストーラです。 インストールガイド を参考にインストールしてください。 バージョン確認 ghcupをインストールしたら $ ghcup list Tool Version Tags Notes ✗ ghc 7.10.3 base-4.8.2.0 ✗ ghc

    おすすめHaskellプロジェクト作成方法(ほぼ)2021年版
    igrep
    igrep 2021/01/02
    おおー、いろいろ知らなかったことがあるなぁ。
  • 1