Haskellは勉強したけどモナドを本当に理解したって言えるのか自信がない… \そんな人向けの試験問題を作りました!/ これから実施する試験問題を、10問中8問正解すればあなたはHaskellのモナドを完全に理解しています。私が保証します! それではさっそく〜〜 第一問 まずは緊張をほぐしましょう。 Haskellの Monad は○○○○である ○○○○に当てはまるのは以下の選択肢のうちどれでしょう? 型 関数 型クラス 型シノニム 答え
タグ検索の該当結果が少ないため、タイトル検索結果を表示しています。
動機 最近、chatGPTにいろいろ尋ねるのが流行っているらしい。Haskellで有名なモナドの概念がなぜ導入されたか尋ねている人を見かけて、そういやそういう記事見たことないなと思ったので適当に調べた。 一次ソース 元ネタは以下のマイナーだと思われる文献 An abstract view of programming languages Eugenio Moggi教授のあんま読まれてない方の論文 Denotational Semantics Peter D. Mosses教授のこの論文(2部あって後半の方) 邦訳があり邦訳で読んだ。 プログラミングのモナド発見の経緯 プログラミングのモナドはなんか包んだり抜き出したり見たいな感じの概念で知られてますが、プログラミングの概念をモジュール化する機構云々の開発の前段階がある。そもそもリストだかIOだか例外処理だかの概念をそれぞれ一つのモジュールに
Haskellは関数型プログラミング言語と呼ばれますが、関数だけでなく型も重要な役割を担っています。アルゴリズムを考える時、手続きの最適化だけでなく、正しいデータ型を選択することがシンプルなアルゴリズムを導き、実装をコンパクトにできるというのはよくある話です。今回は非常に単純な型でありながら幅優先探索というアルゴリズムのエッセンスを詰め込んだ Levelsというデータ型 について紹介したいと思います。 ピタゴラス数を列挙する ピタゴラス数とはピタゴラスの定理における関係式 a^2 + b^2 = c^2 を満たす自然数の三つ組です。 Haskellのリストは遅延評価なので 全ての自然数の三つ組を列挙する 列挙した自然数の中から関係式を満たすものだけ抽出する という手順でピタゴラス数を列挙することを考えてみましょう。 実際この方法は有限な探索範囲ではうまく機能します。 pyth :: [(I
この記事は言語実装Advent Calendar 2020 25日目の記事です。(2022-11-06: 記事の内容を追記していますが、この記事の結論としては「似たようなものは作れるが、完全体にはならない」です) 前提知識 高階カインド型 モナド 従来のエミュレーション方法 Generic Associated Types を用いたエミュレーション(new!) 型クラスを定義する Functor を用意する Pointed を用意する Applicative を用意する Monad を用意する いくつか型を実装していく 現状実装できないもの do 記法 Generic Associated Types(GATs)とは何か 追記(2022-11-06) リポジトリ 参考文献 モナドに関する話題が言語実装アドベントカレンダーの範疇に入るのかわかっていませんが*1、プログラミング言語がお好きな方
前回の記事は魔法のように見える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 = {
今まで不満の多かったHaskellのレコードの扱いを改善するための一歩として、NoFieldSelectorsというGHC拡張の実装を進めている。 動機 Haskellにはレコードを定義するための構文がある。 data User = User { userId :: Int , userName :: Text } こう定義すると、各フィールドごとにuserId :: User -> IntとuserName :: User -> Textというゲッターに相当する関数が生成される。これらの関数は特別な意味合いを持っており、以下のレコード操作の構文にも利用できる。 構築 User { userId = 0, userName = "Zero" } パターンマッチ case foo of User { userId = x, userName = name } -> ... 更新 foo {
2020.08.17 週刊Railsウォッチ(20200817前編)お盆も続くRails改修、Rails 6.1にManyモナドが入る?rails-auth gemでクライアント認証ほか こんにちは、hachi8833です。皆さま熱中症にはお互い気をつけましょう。 参考: 熱中症を防ぐためには(環境庁PDF) つっつきボイス:「昨日急に体調つらくなって、自分でもびっくりするぐらい丸一日寝てたんですけど、もう一日の記憶がありませんし😇」「これだけ暑いと冷房の効いた部屋にいても体調悪くなりそうですよね...」「いやホントお大事に💊」「ウォッチも熱中症対策ということでエントリを減らし目にしました」 私も猛暑になるととりあえず梅干ししゃぶってクエン酸補給してます。 「そうそう、『室温28℃はエアコンの設定温度ではありません』ってよく注意喚起されてますよね」「自分はとりあえずエアコン27℃にして
qiita.com C++、Rust、Pythonなど、他の言語では当たり前のように多用される動的配列だが、Haskell実装は(開発を始めた時点では)見当たらなかったので作ってみたお話*1。 動的配列とはミュータブルな配列の一種で、通常の配列操作だけでなく、末尾への要素の追加・削除が定数時間で行える構造である。確保しておいた領域がいっぱいになったら、その2倍の大きさの領域を確保するという方法によって、漸近的には要素の追加は定数時間となる。 内部の配列には、デファクトスタンダードであるvectorパッケージを用いる。Vectorには無印(boxed)、Unboxed、Storableの三種類の変種があり、それぞれ以下のように使い分ける。 無印(Data.Vector): サンク含め、任意のHaskellのオブジェクトを格納できる。Traversableなどのインスタンスであり、汎用性が高い
TL;DR github.com 並行処理を簡潔かつ安全に記述できるライブラリを作った。ApplicativeDo拡張を使って、以下のようにoathの引数として与えたIOアクションを同時に実行し、結果を集める処理を書ける。いずれかが例外を投げた場合、残りをキャンセルするためリソースを漏らす心配がない。 evalOath $ do a <- oath $ ... b <- oath $ ... f a b 経緯 Haskellは並行処理が得意とされている。事実、軽量スレッド、MVar、STMといった処理系によるサポートが充実しており、HackageのConcurrencyカテゴリには235ものパッケージがあることからもユーザの関心の高さが窺える。 並行処理を実用する上では、単にスレッドをフォークするだけでなく、計算の結果を集める必要がある──Scalaなどで言うFutureに近いものがあると
関数をデバッグするために、引数と戻り値をそれぞれ表示するというのを誰しもやったことがあると思う。今回はそれを自動化するからくりをHaskellで実装してみる。 目標となるのは、関数が与えられたとき、その引数と結果をターミナルに出力する関数に変換する高階関数、probe :: Traceable a => String -> a -> aである。 testDelay :: Double -> Double -> IO () testDelay dur dur' = threadDelay $ round $ (dur + dur') * 1000000 *Probe> probe "testDelay" testDelay 1 2 testDelay 1.0 2.0: () これは型クラスを活用すればお茶の子さいさいである。以下のように型によって挙動を切り替える関数withTraceData
Rust1.74でモナドを作ってみようとしてたのですが、今回はその続きになります。 なんで続きをやろうと思ったの? Rust1.74で導入された以下の機能を使って、モナドを作ろうとしたのですがその時は残念ながらできませんでした。(詳細はこちらを参照ください。) その時は、traitの中で -> impl Traitをすることができなかったので断念したのですが、Rust1.75で導入された以下の機能を使えばできそうに見えました。 そのため、この機能を使って再チャレンジしようとしたのがこの記事になります。 この機能で何ができるようになるのか 詳細は上記blogを見ていただくとして、ざっくり説明すると、Trait内で-> impl Traitを定義することができるようになります。 上記blogからの引用ですが、こんな感じです。 trait Container { fn items(&self)
GitHubのプロフィールを見た人などはもしかしたら気づいているかもしれないが、Tsuru Capital LLCを退職し、2022年2月16日よりHERPの正社員となった。HERPは、大まかに言えば採用活動を管理するプラットフォームを提供している。 きっかけ Tsuru CapitalはKospi(韓国株のインデックス)のデリバティブを半自動取引する企業で、Haskellを使っているというのが最大の特徴として知られる謎多き会社だ。2015年に入社し、2022年まで6年以上働いた。流石に同じ職場にずっといると経験が偏ってしまうし、感覚としても飽きがきたので転職を考えた。 また、ある時期からRustメインの開発をするようになったが、やはり自分の最大の強みであるHaskellを活かせる仕事をしたく、転職先を考える基準となった。 拙作のライブラリであるextensibleを使っているという情報も
この記事は NSSOL Advent Calendar 2022 の1日目の記事です はじめに 私が現在所属しているチームでは、フロントエンドもバックエンドも共にTypeScriptをで開発を進めており、具体的にはフロントエンドではReact、バックエンドではNestJSを使用しています。 TypeScriptで共通化させることで、TypeScriptが提供する型安全性を享受しながらも、バックエンドとフロントエンドで大きなコンテキストスイッチを発生させることなく開発を進めることができていると感じています。 ただ、実感としては、バックエンドではソフトウェアで解決したい対象となるドメインのモデルを class で表現したり、フロントエンドのReactでは小さい関数や hooks を集約させることでロジックを表現したりと、フロントエンドとバックエンドでのロジックの構築方法に差異を感じていました。
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? この記事は Scala Advent Calendar 2022 の 21 日目の記事です。1 It's a standing joke in the Haskell community that every Haskell programmer, as part of his or her learning process, will eventually write one or more monad tutorials. I'm certainly no exception. 拙訳: Haskell コミュニティでは、「Haske
21世紀現在のプログラミング言語において、モジュールという機能はほぼ必要不可欠である。ソースコードを分割し、明示的な依存関係を指定する仕組みであるモジュールは、以下のような様々な恩恵をもたらす。 インクリメンタルビルド: モジュールごとにコンパイル結果を保存し、変更されていない部分を再コンパイルするのを防ぐ。 内部の隠蔽: 実装の詳細を隠蔽し、モジュール外から触れないようにする。プログラムの見通しをよくしたり、不正な操作をする機会を減らす。 アーキテクチャの整理: モジュールは他のモジュールを参照できるが、原則として相互参照はしない。依存の向きを定めることで、適切な抽象化と、 それに基づいた実装の分離を促す。 さて、いくらモジュールが便利と言えど、数が増えすぎるとさすがに扱いにくい*1。そのため、ディレクトリの構造をモジュールの階層構造として運用する仕組みが備わっていることが多い。 コンパ
C++ Advent Calendar 2022 の 3 日目の記事 を読んだのですが、C++の規格を作っている人の中にモナドが好きな人がいるようで、仕様書の中にモナド的などという単語を必要もないのに入れようしているようです。それでモナドに興味を持った人もいるかと思って記事を書いてみることにしました。巷にモナドの説明自体はいっぱいあるんですが、Haskellを使って説明するものばかりで読みにくいですし、なんだか要領を得ないものが多いので、C++で説明する需要はあるだろうと思っています。ただし、C++でモナドを作っても意味がないよという否定的な意見を書きますので、そういうのがお好みでない方は許してください。 シンタックスシュガーがないのに、モナドを作るんですか? とりあえず説明のために簡単なIOモナドっぽいのものを書いてみます。まず、文字列を表示する動作を次のように書けるようにします。これは
突然ですが、Stateモナドの実装を書けますか? Stateモナドは自由に読み書き可能なグローバル変数のような機能を、副作用を伴わない純粋な関数だけを使って実装するための便利な概念です。使うだけなら簡単なので普段から便利に利用してる人も多いかもしれませんが、いざ自分で実装しろと言われると手が止まってしまう方もいるのではないでしょうか。 今回はそんなStateモナドの実装を丁寧に見ていき、仕組みを理解することを目指したいと思います。 State さっそく以下に示すのがStateモナドの型の定義です[1]。 まずStateはnewtypeを使って関数と同じ型として定義されます。この関数は以下の構造を意識して作られています。 実行前後で状態の型は変わりませんが、値に関しては変更することが可能になっているのです。 モナドにするためにはFunctorとApplicativeのインスタンスにする必要が
こんにちは,エムスリーエンジニアリングGの榎田(@niflh)です.趣味は数学とテレビゲームです. 以前の記事 で Scala を通して関数型を勉強した話をしましたが,最近社内で Scala with Catsを読む勉強会をしています.この本は,Cats という「Scala で関数型プログラミングをサポートするライブラリ」を勉強しつつ,関数型特有の概念に慣れ親しむことを目的としたものです. この勉強会も,参加者の皆さんと二人三脚で進み,モナドを扱う章に入りました.そんな中,参加者の一人から,次のような意見が出ました. モナドをやるとよく圏論が出てくるので,かじってみると面白い一方,よくわからないことも多い.プログラミング上のどの操作が圏論とかのどの操作に紐付いてて,何が嬉しいのか,あたりがまとまってると嬉しい. 尤もだと思ったので,色々調べて考えた結果が本稿です.一記事には長すぎるようにも
このところ、仕事の手が空いたときに、Haskell というプログラム言語を勉強しています。Haskellは僕がふだん使っているJavaなどとはかなり趣きが異なるので、 考えさせられる点が多く、気分転換にはぴったりです。 とはいえ、最初はさっぱり理解できない点もありました。「IOモナド」です。 Web上の色々な資料を読んでいるうちにだいたいのところは理解できたのですが、そうなってみると、今度は、 最初に読んだ何冊かの入門書やWeb記事でのIOモナドの説明の仕方が気になってきました。 こうした記事は、素人向けに易しくIOモナドを説明しようとして、その結果、かえって読者を煙に巻いてしまっている面があるんじゃないかと思います。 IOモナドは、Haskell の鬼門とか呼ばれているようですが、わかってみるとさほど難しいものではありません。であれば、僕自身がきわめて素人くさくIOモナドを理解した仕方を
Haskellでファイルなどのリソースの解放を保証するテクニックとして、ローンパターン(Loan Pattern)がある。withFile :: FilePath -> IOMode -> (Handle -> IO r) -> IO rなどがその例だ。 ローンパターンによる関数を複数使ったプログラムは、無名関数のネストが深くなる。 main = do withFile "src.txt" ReadMode \src -> withFile "dst.txt" WriteMode \dst -> ... この問題には、継続モナドContTを使ったきれいな解決策が知られている。 main = evalContT do src <- ContT $ withFile "src.txt" ReadMode dst <- ContT $ withFile "dst.txt" WriteMode .
はじめに こんにちは、コンテナソリューション事業部の髙井です。 時が過ぎるのは早いものでもう年末ですね。 さて、よく耳にするのに調べても難しそうでいまいち正体のつかめない言葉ってありませんか。 たとえば「モナド」もそのひとつだと思います。 ということで今日は「で、結局モナドってなにが嬉しいんだっけ?」に少しでも近づくことを目標に書いていきたいと思います。 まずは調べる ネットで調べたら「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」と書いてあって試合終了したので、とりあえず関連しそうな本を数冊読んできました。 すごいHaskellたのしく学ぼう! 作者:MiranLipovacaオーム社Amazon [増補改訂]関数プログラミング実践入門 ──簡潔で、正しいコードを書くために WEB+DB PRESS plus 作者:大川徳之技術評論社Amazon JavaScrip
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く