タグ

haskellに関するpetite_blueのブックマーク (9)

  • This FTP site

    Index Unless specified otherwise, all the code and the documentation on this site is in public domain Recent changes:  August 1, 2024 | RSS | Atom Computation fixpoints; Having an Effect; monads; programming as collaborative reference; effects without monads; Turing machines; Markov algorithms; R-technology; CK macros; generators vs. lazy evaluation; IO monad realized in 1965; grasping patterns; t

  • Writerを使ってはならない - Qiita

    2022-05-20追記: mtl-2.3, transformers-0.5.6以降においてリークの起こらないCPS版Writerが提供されているのでそちらを用いてください: https://hackage.haskell.org/package/mtl-2.3/docs/Control-Monad-Writer-CPS.html https://hackage.haskell.org/package/transformers-0.5.6.0/docs/Control-Monad-Trans-Writer-CPS.html Writer Monadの問題点 Haskell スペースリーク アドベントカレンダーX日目(X ~ 360)です。 Writer Monadを使ってはならないという話があります。 理由は単純で、スペースリークが発生するためです。 以下の単純なアクションを評価してみま

    Writerを使ってはならない - Qiita
  • スペースリーク、その傾向と対策

    スペースリークの傾向とその対策を見ていきます。 ここでは3つのパターンを取り上げます。他のパターンがまだ見つかりそうな気がしているので、気がついた方は是非記事を書いてください。 注意事項 「サンクを積む」という表現を多用していますが、「関数適用によってサンクを大きくする」と言った意味合いで使っています。多分に誤用なので外では使わない方がいいと思います(と思ったらそういう表現を使うこともあるそうです) 以前の記事もそうですが、「簡約」は「評価」に統一してます 基方針 追記: 正格評価 無限ループをしない 必要ない式は評価しない 遅延評価 無限ループをしない 必要ある式はサンクを積まない サンクの必要とする空間と、潰した後の空間 サンクは必ずしも悪いものではありません。非常に大きなサンクの場合とそれを潰した場合に、どちらがメモリを消費するかは一概には言えないのです。 少し違いますが、わかりや

    スペースリーク、その傾向と対策
  • Freeモナド - haskell-shoen

    2013年、Extensible Effects: an alternative to Monad Transformersが発表された。ベースのFunctorを拡張可能バリアントにすることでさらにモナドを作りやすくし、しかも変換子のスタックよりも早くなるというものだ(実際のところ、ほとんどの場合遅くなる)。斬新なアイデアであることは間違いなく、世界中を沸かせた。 従来のFreeモナドは、>>=が左結合になっていると二乗オーダーで遅くなるという欠点を抱えていた。かと言ってCPS変換すると、ステップ単位での実行ができない。それに対するソリューションとして2014年、Reflection without remorseというアプローチが生まれた。これは、継続の列を結合可能キューに格納することによって、その弱点を克服するというものだ。しかし、そのキューは極めてオーバーヘッドが大きく、通常のFre

    Freeモナド - haskell-shoen
  • UTF-8のバリデーションとモノイドと半群

    この記事はUTF-8のバリデーションとオートマトンの続きです。 前回はUTF-8のバリデーションが8状態のオートマトン (DFA) で表現できることを見ました。状態と遷移を擬似コードで書けば次のようになるでしょう: -- 8つの状態 data State = START | TAILx1 | TAILx2 | TAILx3 | A | B | C | D -- 入力バイトに応じて次の状態を返す。次の状態が該当しなかったら Nothing を返す next :: Word8 -> State -> Maybe State +----+----+-----+----+ | a0 | a1 | ... | aN | 8ビット整数列 +----+----+-----+----+ | | | v v v +----+----+-----+----+ | m0 | m1 | ... | mN | モノ

    UTF-8のバリデーションとモノイドと半群
  • WebAssembly backend merged into GHC

    Tweag has been working on a GHC WebAssembly backend for some time. Recently, the WebAssembly backend merge request has landed in GHC, and is on course to appear in the upcoming 9.6 release series. This post will give a quick demonstration of how to try it out locally, and explain what comes in this patch and what will be coming next. Playing with WASM locally If you’re using nix on x86_64-linux, c

    WebAssembly backend merged into GHC
  • Levelsモナドを使った幅優先探索の仕組み

    Haskellは関数型プログラミング言語と呼ばれますが、関数だけでなく型も重要な役割を担っています。アルゴリズムを考える時、手続きの最適化だけでなく、正しいデータ型を選択することがシンプルなアルゴリズムを導き、実装をコンパクトにできるというのはよくある話です。今回は非常に単純な型でありながら幅優先探索というアルゴリズムのエッセンスを詰め込んだ Levelsというデータ型 について紹介したいと思います。 ピタゴラス数を列挙する ピタゴラス数とはピタゴラスの定理における関係式 a^2 + b^2 = c^2 を満たす自然数の三つ組です。 Haskellのリストは遅延評価なので 全ての自然数の三つ組を列挙する 列挙した自然数の中から関係式を満たすものだけ抽出する という手順でピタゴラス数を列挙することを考えてみましょう。 実際この方法は有限な探索範囲ではうまく機能します。 pyth :: [(I

    Levelsモナドを使った幅優先探索の仕組み
  • Haskell入門

    Skip to the content. Haskell入門 従来の言語では問題を部分化する方法について概念的な限界がいくつかある。関数型言語はこれらの限界を押し広げるも のである。 なぜ関数プログラミングは重要か 関数プログラミングを習得するには,これまで命令プログラミングで培った技術はいったん忘れ,真っ白な気持ちで臨む必要があります。関数型の山を登るためには,命令型の山を降りなければなりません。 第1章 関数プログラミングは難しくない! Haskellは理解すれば理解するほどきれいに書けることを約束してくれます。信頼してください 常にパターンを探しましょう。単純になるとき、またその時だけそれらを抽象化するのです 辛抱強く抽象化を正しく理解しましょう。もしそれが出来たならすべてのことが魔法のようにつじつまが合うようになるでしょう。 実装そのものが設計図となります … Haskell Ma

  • モナド教

    前提知識:モナド モナドを理解せずともモナド教を信ずることは出来ますが,理解していればより深く納得できるでしょう. 操作 :: 型 -> 型 は,"型"から"型"へ写す"操作"の存在を表します. モナドの文脈 m が必要とする2つの操作: return :: a -> m a で,値を保ちつつ文脈 m の中に入れ込むことが出来ます. (=<<) :: (a -> m b) -> (m a -> m b) で,「値を文脈に入った別の値へ写す操作」を「文脈に入った値を同じ文脈に入った別の値へ写す操作」に変換します. id :: a -> a は値をそのまま返す操作です. id を =<< で変換して得られる操作 join :: m (m a) -> m a で,二重に文脈に入った値を一重の文脈に入った値に戻すことが出来ます. 文脈の値から生の値を取り出す型 m a -> a を持つ操作は,一般

  • 1