タグ

Haskellに関するryskosnのブックマーク (96)

  • Agentultra - Using Haskell in Production

    Posted on September 8, 2025 I get asked on my stream and at talks I give, “What is it like to work in Haskell in production, full-time?” From November of 2020 until August 2025, I was employed at Mercury where I wrote code in Haskell. During that time I also started up a live video stream where I’ve built several libraries, games, and applications in Haskell for an audience. This post is a summary

  • 随伴を使って理解するStateモナドの実装

    前回の記事は魔法のように見えるStateモナドの実装も、順を追って見ていけば理解することは難しくないという話でした。 しかし状態の変更を順番に処理するというような手続き的な考え方にかなり近い構造が、うまくモナドになってくれるというのは少し不思議ですよね。 この記事では タプル (a, b) 関数 a -> b カリー化 curry :: ((a, b) -> c) -> a -> b -> c uncurry :: (a -> b -> c) -> (a, b) -> c といったHaskellの基的な要素が随伴と呼ばれる関係を構成することを見て、 その随伴からStateモナドが導かれることを説明していきたいと思います。 随伴 二つの圏 C, D と二つの関手 F : C \rightarrow D, G : D \rightarrow C が与えられたとしましょう。 もし GF = {

    随伴を使って理解するStateモナドの実装
  • 順を追って理解するStateモナドの実装

    突然ですが、Stateモナドの実装を書けますか? Stateモナドは自由に読み書き可能なグローバル変数のような機能を、副作用を伴わない純粋な関数だけを使って実装するための便利な概念です。使うだけなら簡単なので普段から便利に利用してる人も多いかもしれませんが、いざ自分で実装しろと言われると手が止まってしまう方もいるのではないでしょうか。 今回はそんなStateモナドの実装を丁寧に見ていき、仕組みを理解することを目指したいと思います。 State さっそく以下に示すのがStateモナドの型の定義です[1]。 まずStateはnewtypeを使って関数と同じ型として定義されます。この関数は以下の構造を意識して作られています。 実行前後で状態の型は変わりませんが、値に関しては変更することが可能になっているのです。 モナドにするためにはFunctorとApplicativeのインスタンスにする必要が

    順を追って理解するStateモナドの実装
  • Haskeller の異常な愛情:または、生粋の Haskeller は転職して Rust を一ヶ月半書いて何を思うようになったか

    Haskeller の異常な愛情:または、生粋の Haskeller は転職して Rust を一ヶ月半書いて何を思うようになったか この記事は Jij Advent Calendar 2024、Haskell Advent Calendar 2024、およびRust Advent Calendar 2024シリーズ2 の18日目の記事です。 TL; DR:Haskell にも Rustにもよいところがあるので、お互いいいとこ取りをしていきたいですね! はじめに:転職しました このたび諸般の事情[1]により転職しまして、2024年11月から株式会社JijというところでRustを書いております。 筆者はかれこれ17年くらいはHaskellを書きつづけており、前職でもほぼ全てのものをHaskellで書いていたくらいには生粋のHaskellerです。今回もできればHaskellを書く仕事をできると

    Haskeller の異常な愛情:または、生粋の Haskeller は転職して Rust を一ヶ月半書いて何を思うようになったか
  • Haskellを雑に使う

    はじめに Haskell Advent Calender 2024の7日めの記事です。 さて、Haskellはアカデミックやプロダクションやホビーや日常使いなど様々なシーンで利用できます。 この記事ではHaskellを電卓くらいの気軽さでカジュアルに日常使いする一例を紹介します。(昨年のAdvent Calenderの記事と内容が重複気味ですが、今年はワークフロー視点で記載しています。) なんとなく、アルゴリズムを手軽に試したい 日常的に、ちょっとしたアルゴリズムを手早く確認したり、書き捨てのプログラムをささっと作って試したいシーンがあるでしょう。あるものとします。 ここでは話を小さくするために、簡単な例として整数ソートのアルゴリズムを試したいとしましょう。 とりあえず書き捨ててみる 頭の中や紙の上などである程度考えたら、とりあえず雑に書き下してみましょうか。なんらかのテキストエディタで、

    Haskellを雑に使う
    ryskosn
    ryskosn 2024/12/15
    doctest 便利そう
  • 歩留まりに有意差があるか確かめる、あるいはベルヌーイ試行の成功率の信頼区間

    TL;DR 歩留まりの数値(成功数/サンプル数)だけを比較しても、どちらが良いかはわからない だが、サンプル数と成功数から「成功確率はほぼ確実にpからqの間である」という範囲(信頼区間)を求めることができる 信頼区間を用いることで、自信を持って比較ができる 技術職のみならず、営業職や経営者にも役に立つ イントロダクション 成功数xと試行回数Nがわかっている時、当の成功率はわからないが、Nが十分に大きければ「成功率はx/Nに近い」と言える。しかし、特にNが小さい場合、「成功率はこの範囲にあるのではないか」という当たりをつけたいことがある。こういった場面で役立つのが信頼区間である。 信頼区間とは、かいつまんで説明するとこうだ。 例えば、サイコロを投げ、1が出たら成功、それ以外は失敗とする。この時の成功率の信頼区間は、成功した回数と試行回数を元に計算できる(実際の計算手順は後述)。 「70回中

    歩留まりに有意差があるか確かめる、あるいはベルヌーイ試行の成功率の信頼区間
  • recursion-drill/README.md at main · kazu-yamamoto/recursion-drill

    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert

    recursion-drill/README.md at main · kazu-yamamoto/recursion-drill
  • 「アルゴ式」をHaskellで学ぶための準備

    この記事は、CAMPHOR- Advent Calendar 2021 の7日目の記事です。 「アルゴ式」というプログラミングを学んで実践できる非常に良質なWebサービスがあります。 アルゴリズムについて解説された教科書だけでなく、実際にプログラミングを書いて提出してオンラインでジャッジしてくれるシステムを備えた練習問題も用意されているのが特徴です。さらにこのオンラインジャッジシステムは多くのプログラミング言語に対応しており、その中にはHaskellも含まれています。 今回はこのアルゴ式を読むにあたって練習問題をHaskellで解くために必要になりそうな知識についてまとめました。アルゴ式は現在ベータ版なので将来的な変更で変わってしまうものもあるかもしれませんが、2021年12月現在の練習問題を全てHaskellで解いた上で必要になったものをまとめているので参考にしていただけると幸いです。

    「アルゴ式」をHaskellで学ぶための準備
  • IO モナドと副作用 - Haskell-jp

    純粋関数型プログラミングで副作用を扱う方法Posted by Mizunashi Mana on April 05, 2020 Haskell は他のプログラミング言語には見られない特徴を多く持っている。その中の1つが純粋性だ。Haskell は純粋関数型プログラミング言語であることを、売りの1つにしている。しかし、純粋性は多くの場合表現力の縮小を招く。ところが Haskell は、IOモナドの導入により、通常のプログラミング言語と変わらぬ表現力を持てるようになっている。これは、とても驚くべきことだ。しかし、同時にこれは Haskell 入門者にとって、大きな混乱を招いているようだ。 今回は、そもそも純粋性とはなんなのか、なぜ他の言語は純粋性を担保できないのか、そして Haskell はどうやって IO モナドにより純粋性を担保しつつ他の言語と変わらない表現力を持てるようにしているのかにつ

    IO モナドと副作用 - Haskell-jp
  • Haskell For a New Decade

    Haskell Problems For a New Decade It has been a decade since I started writing Haskell, and I look back on all the projects that I cut my teeth on back in the early part of this decade and realise how far the language and tooling have come. Back then Haskell was really barely usable outside of the few people who would “go dark” for months to learn it or those lucky enough to study under researcher

  • Haskellに関する備忘録(基礎編) - 中級プログラマを目指す

    PCに埋もれていたものを発掘したので備忘録として載っけときます。 あまりに色々省略されすぎていて初心者には何の参考にもならないし、中級者には当たり前すぎて何の参考にもならない。 初心者の中の初心者のときに作ったものなのでマサカリポイント(特に最後の方)が滅茶苦茶あるけど面倒なので修正しません。 修正して欲しいところとかはツイッターで投げて 基礎 関数呼び出し succ 8 関数名 変数orリテラル リスト [1,2,3,4,] [1..10] ['a'..'x'] [x*y | x<-[1..10], y<-[1..10], x*y>54] 条件でフィルタリングできる タプル (1,4,5) 型が違っても使える 各要素が別の型の扱いなので、一緒に使おうとするコンパイルエラー 型変数 型の一般化 型クラス 型の分類 その型がどのような振る舞いを持つかを定義することによって分類 モナドとか (

    Haskellに関する備忘録(基礎編) - 中級プログラマを目指す
  • Haskellの入門から中級者になるまでの指針 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? プログラミング言語の学習は一般に大変である。 最初にどのようなことをすればいいのか、どのをよむべきなのか等疑問は尽きない。マイナーな言語で情報が少なければなおさらである。 この記事では諸事情でHaskellに入門することになった方にむけて、どのように勉強していくか、参考にすべきや記事を紹介する。 より良い指針にするためにも、指摘、感想等はコメントや私のTwitterアカウント(@Lugendre)に投稿して頂けるとありがたい。 入門〜初心者 環境構築 まずどんなプログラミング言語においても、プログラミングをする環境が必要である。Ha

    Haskellの入門から中級者になるまでの指針 - Qiita
  • Haskell〇〇多すぎ問題 - LugendrePublic

    初心者が入門書を読んでさぁ書くぞとなったときにつまずくところのうちの一つが,同じようなライブラリが多すぎ問題である. ということでそういうライブラリの話をしよう. 例によって例のごとく間違っていること書いてあるかもなので報告よろしく. モナド変換子 Haskellで実用的なプログラムを書く上で避けて通れないものの一つにモナド変換子がある.こいつはなにかというと,簡単に言えば,モナドを合成してでかいモナドを作るやつである.人間がおおよそ使うであろうモナド変換子はライブラリで提供しているので,それらを組み合わせてお望みのモナドを作ろうとするわけだが,そこに立ちはだかるのがtransformersとmtlである. transformersとmtl transformersはlift という下位のモナドのアクションをでかいモナドのアクションに持ち上げてくれるメソッドが定義されたMonadTrans

    Haskell〇〇多すぎ問題 - LugendrePublic
  • Haskell書いてるときになんとなく気をつけていること - LugendrePublic

    信頼性はない 都市伝説かもしれん 大体枕詞に特別な理由がなければがつく 思いついたら徐々に更新する それは違うよってことがあったら @Lugendre まで ghc 8.6.5の話(8.8.1は仕事で使ってなくてな......) コンパイル通るかの確認だけなら最適化オプションO0でコンパイルする stackでいうとstack build --fast 動かすときはO2ビルドしたほうがいいが,インライン展開に5億年消費する なんならこのくらいは静的解析に任せてもいいが,でかいプロジェクトだと一定時間動いてハングアップするのしか世の中にないのでオワリ VSCode のせい説もある ghcideに期待 haskell-language-serverがすべてを解決した CIするときは必ずキャッシュする 毎回一から依存関係やGHCのビルドが走って余裕で1時間超えるようになるので データ構造のフィール

    Haskell書いてるときになんとなく気をつけていること - LugendrePublic
  • 日常生活にプログラムを | tnomuraのブログ

    Knuth 教授が提案した、literate program は小説や参考書のように読んで理解することのできるプログラムだ。それは単に読めば理解でき、暗号の解読が必要とならないプログラムだ。 アプリケーションなどの大規模なプログラム作成には、作成のためのオーバーヘッドが大きくて使われていないようだし。いつもこの方法でプログラムを書いている人はいないだろう。 しかし、この方法は日常生活のちょっとした問題を解決するのには便利なような気がする。例えば銀行ローンの利子の計算について、自分でも確認したいと思っても、その仕組みを学習するのは結構大変だ。さらに、その仕組みを理解したとして、それを実行してくれるプログラムを書いてみる必要もある。こんな時に literate programming が活用できるような気がする。 幸い、Haskell には literate programming を意識した

    日常生活にプログラムを | tnomuraのブログ
  • 代数的データ型と初等代数学 - ryota-ka's blog

    この記事は以下のページに移転しました. blog.ryota-ka.me 「関数プログラミングとはなんですか?」と問われたときには「デ,データファースト……(震え声)」と答えることが多いのだが,実際 Haskell や OCaml などの言語を特徴付けるものとして,代数的データ型 (Algebraic Data Type; ADT) の存在は無視できないだろう.その有用性ゆえに,近年では新たな言語の策定の際にその概念が輸出され,RustSwift などの言語にも採用されている. 「代数的データ型とはなんですか?」と問われたときには―問われたことがないのでわからないのだが―おもむろに ghci か utop を立ち上げて,解説を始めるのではないかと思う.ひとしきり解説をした後,「つまり直積の直和なんですよ〜🙌✨」と言って話を締めくくるだろう. int 型や float 型など,「メモ

    代数的データ型と初等代数学 - ryota-ka's blog
  • Haskellライブコーディング: 四則演算で10を作るプログラム (Haskell live coding for make10 problem with Japanese commentary)

    ソースコード: https://gist.github.com/itchyny/a9f238bf154455fad8a2449ec23df72c 言い間違えが何箇所ありますがお許しください (加減乗除・1-3*(-3)など…) 後で見直したらbc -lの-lは関係ないことなくて、必要でした… echo "(5 / (5 / (5 + 5)))" | bc -l など。

    Haskellライブコーディング: 四則演算で10を作るプログラム (Haskell live coding for make10 problem with Japanese commentary)
    ryskosn
    ryskosn 2018/03/04
    倍速?にしてもコーディング速いと思った | プロの方のこういう動画が観られるの、とても面白い
  • モナドを理解する - 迷える者への手引き

    いずれにせよ、システムの状態が時間の関数であり、そのため時間は考慮しなければならない余分な要素となります。"xの値は何?"と問い合わせることは実際できません。代わりに、"時間tにおけるxの値は何?"と問い合わせなければなりません。これではコードを判断するのが難しくなり、複雑な要素が増えます。結論としては... 状態あり: ダメ! 状態なし: グッド! 式とアクション 式とは値を持った文です。たとえば以下のコードを考えてみましょう。 x = 5 y = x + 7 x = y + 1 最初のxは値が5であるという式です。最後のxは値が13であるという式です。コードは他の式も含んでいます。たとえば真ん中の行は、x + 7が12という値であるという式です。 ほとんどのコンピュータ言語では、キーボードから読み込むコマンドは式であり、その式は値を持っています。次の文を考えてみましょう。 x = ne

    モナドを理解する - 迷える者への手引き
  • いろんな言語で「Optional(2018)年」やってみよう - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?

    いろんな言語で「Optional(2018)年」やってみよう - Qiita
  • StackでHaskell開発環境構築【基本編】(追記あり) - haiju's 開発メモ

    Mintのリポジトリを利用しないで、Haskellのビルドツールの Stackで開発環境を構築する手順をメモ(ΦωΦ) [手順] 1. 以下のいずれかのコマンドをターミナルで実行。 $ curl -sSL https://get.haskellstack.org/ | sh or $ wget -g0- https://get.haskellstack.org/ | sh 2. バージョンを確認。 $ stack --version Version 1.6.3 Git revision ....(リビジョン番号) 3. プロジェクトを作成。ここでは、test-mybot $ cd workspace $ stack new test-mybot 4. プロジェクトディレクトリへ移動。 $ cd test-mybot ※もし、インストールしたいライブラリがあったら、プロジェクト直下の tes

    StackでHaskell開発環境構築【基本編】(追記あり) - haiju's 開発メモ