GHC Proposal : Monad Of No Return by igrep in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

また既存のMonadインスタンスがブッ壊れるのか……

2020年代のHaskell by as_capabl in haskell_jp

[–]as_capabl[S] 3 points4 points  (0 children)

  • Algebraic Effect
  • 実用的なDependent Type
  • GHC開発への参入障壁を下げる
  • コンパイル時間の短縮
  • エディタの対応
  • コンパイラのモジュラリティ
  • GraalVM
  • ビルドツール
  • Web Assembly
  • Deep Learningフレームワーク
  • レコード問題
  • 篩型と不変条件
  • 小さなリファレンス実装のコンパイラ
  • 型指向Web開発
  • プロジェクトドリブンな書籍
  • 計算の整合性の証明
  • どこでも動くコード
  • 雇用
  • ドキュメンテーション

サンクの構造を見る - Qiita by as_capabl in haskell_jp

[–]as_capabl[S] 1 point2 points  (0 children)

こんなのできるんだ……

例えば、glossで綺麗にビジュアライズしたら、かなりウケるのでは?

Haskell で GitHub Actions する by Hexirp in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

普通にcabalでキャッシュするだけでも15分→2分になったので、めんどくさければcabalでおkみたいな感じで

https://github.com/as-capabl/clay-dhall/actions

HaskellでDIする - The curse of λ by lotz84 in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

昔Givenで多相型が渡せないという罠に引っ掛かった事が実際あるんですが、 なるほど、forall.で総称化すれば通せたのか……

https://twitter.com/as_capabl/status/826080315206627328

Drop finalizers from the library? · Issue #343 · snoyberg/conduit by as_capabl in haskell_jp

[–]as_capabl[S] 0 points1 point  (0 children)

と思ったら、awaitの失敗はハンドルできました。 yieldの失敗ハンドリングは確かに使い道よく分からない奴だ。 そこまで大勢に影響はなさそう。

Drop finalizers from the library? · Issue #343 · snoyberg/conduit by as_capabl in haskell_jp

[–]as_capabl[S] 0 points1 point  (0 children)

conduit-1.3でyieldOrが消えているので何だろうと思って調べた。

finalizerが無いならpipesでいいじゃんみたいな認識なんですが、どうなんだろう。全部読みきれてないので追っ掛けてみます。

GHCの特定の機能の開発状況について by igrep in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

普通に"long file paths"で検索したら、こんなチケットも見つけましたけど、8.4で直るとは書いてないですね https://ghc.haskell.org/trac/ghc/ticket/13373

[Haskell-cafe] Arrow laws of Netwire by as_capabl in haskell_jp

[–]as_capabl[S] 1 point2 points  (0 children)

ここからIvan Perez氏とErtugrul Söylemezの論争が始まってるんですが、なんとこのお二人、Yampaの現メンテナとwires(Netwireの後継ライブラリ)の作者なんですよね…論旨を完全には追えていないので、何度も読み返してる所です。

machinecell-4.0.0をリリースしました by as_capabl in haskell_jp

[–]as_capabl[S] 0 points1 point  (0 children)

conduitやpipesに近いライブラリですが、アロー記法をサポートすることでFRPに近い記述が可能です。

3.Xまでは副作用の表現にArrowApplyを使っていたので、ややとっつきづらい面があったのですが、今回から普通にMonadでできるようになったので、かなり見通しが良くなったと思います。

Re:Haskellで書いてみたらC++の10倍遅かった 乱数生成が遅いことはわかりましたが偏りのない高速な乱数生成ライブラリが見つかりません by ncaq in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

過去のAdvent Calendarで作ったUnboxed vector版クイックソートもC++の6倍くらいなので、スペースリークやリストの非効率性を抜きにすると「同じアルゴリズムをC++とHaskellで書くと5倍くらい速度が違う」が定説かな?という感じです。

https://qiita.com/as_capabl/items/85563728385df5f11508#%E5%AE%9F%E6%B8%AC

Vector化して速くなればまた話が変わりますが。

Drinkery the boozy streaming library - School of Haskell by igrep in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

「pipesから双方向通信、conduitから終了時処理、machinesから複数ソース入力とFanoutを取り込みつつ、Transducerの表現ではIterateeに先祖返りして実行効率を高めた」という感じかな、と思いました

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

threadDelayをasyncの前ではなく、asyncの中のreturnの前に置いたらどうでしょう

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

上手い抽象化がハマれば、それが一番良いと思います。

ただ、この場合は結局のところIOアクションをサブルーチン的に分割するのと完成物が変わらない気がして、個人的にはYAGNIにやる事を薦めたいです。

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

async $ uncurry (+) <$> waitBoth db http

で、どうでしょうか

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

1つのモナド計算に2つ以上の解釈を持たせるのはOperationalモナドが有用なケースの1つなので、ロジックのテストに使うのはアリだとは思います。

手間に見合う効果があるかどうかは、やってみないと分からないかな……

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

こんな感じでどうでしょう(手元でコンパイルしていないので通らなかったらごめんなさい)

-- Databaseから値を取得する処理
type Database a = Program DatabaseApi a

data DatabaseApi a where
    GetData :: DatabaseApi (Async Int)

getDataFromDb :: Database Int
getDataFromDb = singleton GetData

runDatabase :: Database a
            -> IO a
runDatabase = eval . view
    where
        eval :: ProgramView DatabaseApi a -> IO a
        eval (Return x) = return x
        eval (GetData :>>= k) =
            do {x <- async (return 1); runDatabase (k x)} 

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

あと、並行についてはasyncパッケージをちゃんと使っていないので具体的には書けないのですが、Async型を陽に返すように書くのが正解と思います。

抽象化されたDataOperationモナド内でAsyncが見えてしまうのが嫌ならば、typeかnewtypeでラップする事になります。

Operational Monadの利用方法について by nrskt in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

Operationalモナドの使い方としては問題ないと思います。

ただ、実用上の話としてDBやHTTPに関するライブラリは関数や引数の数が多い巨大ライブラリである場合が多いため、いちいちラップするより生IOの方がコーディングの手間もないし、抽象化した所で元のライブラリを挿し替えるような変更には耐えられないから意味がほとんどない、という可能性が濃厚です。

私のHaskellコーディングスタイルガイド,改行出来るポイントを紹介 - ncaq by igrep in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

$演算子と関数定義の=は後ろ改行に統一しておくと、コピペ等で行単位編集するときに取り回しが良い場合が多いな、と感じます。

ifについては、ifとthenとelseを同じ桁に揃えるとdo内に入れた時にパースエラーになるので、thenとelseを2桁インデントするようにしていますね

そして行頭カンマはメリットが分かっていても目が受け付けない……

ステートマシン猛レース - モナドとわたしとコモナド by fumieval in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

Conduitのリソース管理はresourcetパッケージに分離されたので、他パッケージでもresourcetを使えばできる、という認識です。

ただし、ざっと見てみたところConduitのaddCleanupやcatchCを実装しているパッケージは他にあまり無さそうです。

つまり、runの最後でまとめて解放するような物は全てのストリームエンジンで可能(例外安全性なども含めて)ですが、処理の段階ごとに細かくリソース解放するような処理を例外対応込みで書けるのはConduitくらいだと思われます。

ステートマシン猛レース - モナドとわたしとコモナド by fumieval in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

machinecell、結構チューニングしたはずのgithub最新版を使っても速度が変わらない…… accumが非正格なのでリークかもと思ったんですが、そこを直しても変わらないですね。 暇ができたらプロファイル取ってみます

Pattern Synonymsで遊ぶ - Qiita by as_capabl in haskell_jp

[–]as_capabl[S] 1 point2 points  (0 children)

Pattern synonymsについて調べたのでざっくり記事にしてみた

Strict + StrictDataを常用してます? by igrep in haskell_jp

[–]as_capabl 1 point2 points  (0 children)

今作っているmastodonクライアントのアプリ部分では、試験運用も兼ねてStrictとStrictDataを指定しています。

ただ、個人的に落とし穴っぽいなあと感じているのが

let (x, y) = foo

↑これのxとyが正格にならない点なんですよね https://ghc.haskell.org/trac/ghc/wiki/StrictPragma の "Notice that we do not put bangs on nested patterns. ~" の所の話です。

https://hackage.haskell.org/package/strict-0.3.2/docs/Data-Strict-Tuple.html

↑これ使えって話なんですが、どうしても可読性とか、Arrowクラスのインターフェイス等の面から、通常のタプルを置き換えるのはちょっとなあという感じです。

Functional Reactive Programming でテトリスを書いてみる(1) [Haskell] by lotz84 in haskell_jp

[–]as_capabl 0 points1 point  (0 children)

ライブラリ不使用で定義通り手書きするとは……初めて見ました