読者です 読者をやめる 読者になる 読者になる

generateの罠

vectorパッケージのData.Vectorにはgenerateという関数がある。 generate :: Int -> (Int -> a) -> Vector a 型から全てを知ることはできないが、だいたい想像通りgenerate n fは[f 0, f 1, f 2, ...f (n - 1)]からなるVectorを生成する。しかし、これは要素…

波打たせるものの正体(エクステンシブル・タングル)

Haskell Advent Calendar 11日目 リアルワールドなHaskellerは、幾十ものフィールドを持つ大きなレコードをしばしば扱う羽目になる。モナディックにレコードを構築したい場合、RecordWildCards拡張を用いて以下のようにするのが定番だ。 import System.Rando…

割とすぐに始められるextensibleチュートリアル(レコード編)

ごきげんよう諸君。今回はextensibleについて説明しよう。 extensibleはその名の通り、拡張可能なデータ構造を提供するライブラリである。具体的には、型レベルのリストによって特徴づけられる積と和を提供する。非常に残念なことに、GHC 8.0.1ではコンパイ…

写真の撮り方

物体の発する光や反射した光を結像し、何らかの媒体に記録したものを写真と呼ぶ。カメラと呼ばれる道具には「撮影」という動作が必ず定義されており、撮影によって内部状態に画像を記録できる。内部状態を取り出して処理する(現像)ことで写真が得られる。大…

今のところ比較的簡単なモナドの作り方

準備 モナドを作るには、どんなモナドを作りたいか考える。モナドは一般に、どのようなアクションが使えるかによって特徴付けられる。その点ではオブジェクト指向におけるインターフェイスとよく似ている。 では、foo :: String -> M Boolとbar :: M Intとい…

GHC 8.0.1/base-4.9.0.0の新機能まとめ

GHC 8.0.1は、最上位の桁が変わるだけあって、かなり新しい機能が追加されている。 base-4.9.0.0 めっちゃインスタンスが増えた ghc/changelog.md at ghc-8.0 · ghc/ghc · GitHubを参照。あるべきインスタンスが存在することにより、孤児インスタンスを定義…

比を最適化する

二つの負でない実数、を考える。比をある値に近づけたいといった条件が複数あり、それらを最適化したいとき、どうするのがよいだろうか。 序: 近道の階段 簡単な方法の一つとして考えられるのは、単純に比の差をとり、それらの平方の和を最適化の対象とする…

デシリアライザとスキーマ

盛大に遅れました… qiita.com 最近思いついたネタで実用性の高そうなものを紹介。 binaryやcerealのようなライブラリはデータを密にシリアライズするが、その際にフィールド名や型などの情報は失われてしまう。かといってそれらを一つ一つすべて含めるとひど…

正格フラグ、バンパターン、正格版関数・データ構造

Haskellスペースリーク Advent Calendar 2015 9日目 Haskellerとて、時には厳しくならなければいけないこともある―― @fumieval, 2015 Haskellは遅延評価を基本としているため、場合によっては未評価の式が積もり非効率な状況に陥ることがある。これを防ぐた…

動物、とくにヒトと性について

我々脊椎動物は有性生殖をする。したがって、繁殖に寄与する性質が必然的に残り、そうでないものは消えてゆく。オスは精子、メスは卵を作り出すという非対称性があり、体つきや行動もそれに合わせるように決まるのは自然だ。一夫多妻制の種においては、オス…

就職しました

本日、Tsuru Capitalのポジションを得ました。 Tsuru Capitalはデリバティブの取引を行っている企業で、自動株取引の会社ではありません。取引に関わっている10人のメンバーのうち、創始者であるSimonを除く全員がHaskellerで、取引状況の分析や一部の取引の…

カリー化

鍋にオリーブオイルを入れる。 にんにくを細切りにし、入れる。しょうがを少しすりおろす。いつもの流れである。 玉ねぎの半分をみじん切りにし、鍋に入れ、しばらく炒める。 キャベツ、にんじん、ヒラタケ、残りの玉ねぎ、じゃがいも(皮ごと)を大き目に切り…

最近作った料理(簡単さ順)

面倒なので写真はなし。 ミニマリスティック卵スープ 鍋で水を沸かす。 創味シャンタンを1人あたり小さじ半分ほど入れる。塩で味を補う。 溶き卵を乱暴に投入する。 賞味期限の近い具材を消費するためのチャーハン ごま油とサラダ油を強火で熱したフライパン…

lensパッケージのオプティクス(弱い順)

lensではオプティクスと呼ばれる様々な構造が定義されている。これらの関係を把握していれば、ドキュメントから欲しいものを見つけるのが楽になる。この記事では弱い順にオプティックの数々を紹介していく。 Fold type Fold s a = forall f. (Applicative f,…

Haskellの型クラスを活用する

Haskellの型クラスは、うまく使えば高いパフォーマンスと抽象度を両立できる、優れた仕組みである。その使い方のコツは、決して理解の難しいものではない。 小さな性質、大きな恩恵 プログラマは大きなものを小さく見せがちだ。オブジェクト指向プログラミン…

最近やったこと

最近やったことのまとめ。 CPSのモナド変換子 モナド変換子の速さを測ってみる - モナドとわたしとコモナドfumieval.hatenablog.com で作ったmtl-cの塵を払い、Hackageにリリースした。 StateTやWriterTは中でタプルを作ったり壊したりしているが、CPS変換す…

Haskellでいかに多態を表すか

オブジェクト指向を行使する心 ではオブジェクト指向の必要性と仕組みについて議論した。 インスタンスは言語によって様々な実装方法があるが、大きく分けて「クラス(処理)のインデックス」か「処理そのもの」のどちらかがインスタンスの内部に隠れている。 …

オブジェクト指向を行使する心

今日、とあるツイートでプログラミングにおけるよくある問題が顕現していた。 プログラミングしてそうなサークル探したら、ゲーム公開してて、ソースコード公開されてたから見た。 pic.twitter.com/7W09sb9DFa— タコス(祭り) (@tacosufestival) 2015, 4月 4 …

モノイドと継続渡しの道具箱

関数型言語Haskellにおいて、普通は計算の結果は関数の戻り値として扱うが、「結果を受け取る関数」 に渡すという継続渡しというスタイルもある。これは単なる冗長なやり方ではなく、様々な興味深い性質を持つ。 基本形は、aという値を渡すところを ∀r. (a -…

Haskellにおけるたった一つのデザインパターン

デザインパターンを作らないこと。型とクラスがあんたの武器だ。

出、出~~wwwww銀行員待行列解説奴~wwwwwww

銀行員待行列(Banker's deque)、二つのリストで構成奴~~wwwww 入奴と出奴~wwwwwwwww ↓入奴 三(^o^)ノ [(^o^)ノ, (^o^)ノ, (^o^)ノ] ヽ(^o^)三 [ヽ(^o^), ヽ(^o^), ヽ(^o^)] ↑出奴 追加は入奴にcons、取り出しは出奴にuncons奴~wwwリス…

ぼくのかんがえた最強の拡張可能レコード

動機 GHCに、OverloadedRecordFields(ORF)という拡張の導入が提案されている。 (Records/OverloadedRecordFields/Design – GHCより) Haskellのレコードの深刻な欠点は、フィールドをオーバーロードできないことだ。例えば、 data Person = Person { personId…

副作用の話

最近、副作用や関数型言語についてもめているのをよく目にする。副作用と関数型言語に関する私の見解をここに示す。 処理系はソースコードを解釈し、コンピュータの入出力、つまり副作用に変換する。ほとんどのプログラミング言語は、副作用を表現するプリミ…

オブジェクト指向関連の不満な点

また遅れてしまった…オブジェクト指向 Advent Calendar11日目。 最近いろいろオブジェクト指向について調べていて、やっぱりこの概念はいかがなものか、と思ったことを軽く書く。 継承 まずこれ。オブジェクト指向において「AがBを継承している」というのは…

状態、手続き、OOP

これはオブジェクト指向 Advent Calendar 2014の7日目の記事です。 入力によって変化する状態をうまく扱うことはプログラミングにおいて重要である。この記事では、状態や手続きを扱うさまざまなアプローチを紹介、比較する。 手続き型プログラミング 命令の…

大洗に行ってきたよ

はるアイコン鯖 Advent Calendar 2014 - Adventar ※現実で。 ※現実で。 ※現実で。 海岸 大洗磯前神社入口 絵馬 痛絵馬は西側に偏っている模様。 神社から見える水平線 石が置かれまくっている像 大洗駅内にて 大洗を3つの言葉で表すとすれば、「海」「レンガ…

関数型プログラミングとオブジェクト指向の抜き差し可能な関係について整理して考える

Googleで適当に検索すると とズラリと出てくる。 オブジェクト指向 v.s. 関数型プログラミング 関数型とオブジェクト指向という一見相反するプログラミングパラダイムの併用について理解した プログラマが知るべき97のこと/関数型プログラミングを学ぶことの…

Haskellでオブジェクト指向を再発明する

状態管理のモデル案: spawn/killモデルの実装を作ってみた。 worldsパッケージがそれだ(露骨な名前だが赦してほしい)。前の記事と違う点は、Worldがモナド変換子として実装されている点だけである。 worlds-exampleは画面内のキャラクターを方向キーで操作す…

状態管理のモデル案: spawn/killモデル

生と死のあるアクターを表現するためのモデルについて考えた(あくまで個人用メモ)。 以下の型変数sは世界の一意性、閉鎖性を表す。生命や名前を勝手に外に持ち出すことを防ぐために必要。 Life m a: 生命を表す型。aは生命の最終結果。 Name s a: 生命に与え…

本日の料理: ヤングコーン、ピーマン、豚肉の炒め物

食材と処理 にんにく1かけをみじん切りにする。 ピーマンの実を適度な大きさに分割する。 ヤングコーン(水煮)を小穂に対し斜めに切断する。 豚の細切れ肉を用意する。 調理 フライパンを中火で熱する。 フライパンにごま油を適量入れる。 にんにくを入れて香…

Karakuriの導入(0) -状態をぶった切る!-

あるとき、私は思った―― 「Getter、Setterと、状態を次に進める関数を持つ何かがほしい!そうすればゲームやユーザーインターフェイスなどがとても書きやすくなるのに……!」 私はそれをカラクリと名付けた。存在するかどうかわからない理想の構造を求めて… …

継続渡しなHaskellライフ

CPS(Continuation passing style, 継続渡しスタイル)は、関数型プログラミングにおけるプログラムの書き方の一つである。CPSを導入する簡単な例をいくつか紹介しよう。 まず、入力された数値が3の倍数かどうかを判定するプログラムを作ってみよう。 foo :: I…

Lensを使うぜ!

パッケージをインストールするぜ!そしてさっそくghciを起動するぜ! $ cabal install lens $ ghci GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linkin…

Haskell Advent Calendar 13日目: シンセサイザーで理解するArrowプログラミング

Haskell Advent Calendar 13日目の記事です。 ごきげんよう。 今年も音楽の冬がやってまいりました。Haskellより音楽のほうに力を注いでいる気がするこの頃ですが、ふとこう思いました――「Haskellでシンセサイザーを作たらとても楽しいのではないか?」 シン…

Operationalモナドをゲームに応用した話

データを処理することは、プログラミングのもっとも本質的な部分である。数値、文字列、あるいはデータの集まりなどを扱うために、数々の構造が考えられてきた。Haskellにおいては、「手順」もデータとして扱うことができる。これは、DSLを作るうえで非常に…

ミックスの仕上がりを綺麗にする(かもしれない)簡単な工夫

ミキシングはコンピュータによる楽曲制作には欠かせない。きちんとミキシングしなければ、まるで重油の浮いた泥のようなサウンドになってしまうのはご存じだろう。 ミックスにおける重要な課題の一つは、低域をすっきりさせることだ。低域をクリーンにするこ…

高専プロコン競技部門に参加した

どうも、Haskellの宣伝をしまくっていた@fumievalです。 全国高等専門学校 第24回プログラミングコンテスト競技部門に、@NKMR_YA、@39moguraさんと一緒に茨城工業高等専門学校の代表チームとして出場しました。 去年もそれを使った、ような… 競技の流れは以…

「茨城」の読みは「いばらぎ」ではない

いばらき、と読め

型からHello world

Restricted Wordsに参加した。 "Hello World"という文字列を出力するプログラムを、文字・文字列・数値リテラルを使わずに書くという問題。で、回答のコードがこちら。 import Data.Reflection -- cabal install reflection main = putStrLn $ map toEnum [ …

Lazy K 基礎文法最速マスター

Unlambda記法 適用 `FG F、Gは任意の式。 コンビネータ計算記法 適用 (FG) F、Gは任意の式。 Iota記法 適用 *FG F、Gは任意の式。 Jot記法 空白のコード → 恒等関数 X0 → X S K X1 → S (K X) Xは任意の式で、S、Kはコンビネータ。

モナドとはモナドである

この記事を読む前に、絶対に理解出来ないモナドチュートリアルに一度目を通してみてほしい。モナドを理解していく上で、とても重要なことが書かれている。 改めて言おう、モナドはモナドだ。コンテナだとかプログラマブルセミコロンだという説明では、モナド…

モナドの六つの系統[Functor x Functor]

モナドは「アクション」を表す抽象的な構造である。モナドは、Haskellにさまざまな概念に対する記述能力をもたらす。 モナドの基礎 return :: a -> m a: 純粋な値をモナドで包む。 m >>= f :: m a -> (a -> m b) -> m b: モナドmに包まれた値をfに渡し、その…

Freeモナドを超えた!?operationalモナドを使ってみよう

限定版IOみたいなモナドを簡単に作れたら、コードが分離できるしテストもしやすくなるのになあ… 数か月前なら、 それ、Freeモナド*1でできるよ! と返されるだろう。だが今は違う。Freeモナドよりも簡単にモナドを作れるモナド、Operationalモナドがあるのだ…

Indexed Monadの世界

もっと、モナドの力を引き出したくはないか? え?アクションの前後で型を変えたい?いやいやいや、モナドは自己関手の圏上の単なるモノイドだよ、そんなことができ…る…!?えっ、できるの…マジで…? できる。そう、Haskellならね。 {-# LANGUAGE QuasiQuote…

8つの質問で、Lazy K業界の現状を知る

Lazy系の会社の隆盛があって、仕様が定められたのが8年ぐらい前だろうか。 コンビネータ産業の人材動向が、今どうなってるかって? 大方の予想より凄惨ですよ。 それが分かる方法がある。Lazy K技術者に技術力を問う8つの質問によってだ。 Lazy K業界のエン…

Freeモナドでゲームを作ろう!第3回: Haskellは手続き型言語

※最新のfree-gameを想定しているので、古いバージョンを使っている方は今すぐアップグレード(cabal update && cabal install free-game)してください。 7週間以上開きましたが、第3回です。ここからはどんどんプログラムを組み上げていきます。 コードが長く…

モナド変換子の速さを測ってみる

mtl(実装はtransformers)で提供されているモナド変換子のLazy版とStrict版で、どのくらいパフォーマンスの差が出るか調べてみた。また、私がCPS(継続渡しスタイル)で実装したものとも比較してみた。 比較方法 {-# LANGUAGE FlexibleContexts #-} import Cont…

ヘッズのための純粋関数型言語「Lazy SLYR」

ドーモ、変数スレイヤーです。 Brainf*ckめいた派生言語が作られる前に、ニンジャスレイヤーを基にしたニンジャヘッズのための言語「Lazy SLYR」を作ってみた。 ◆Brainfuck派生ではない◆ ◆Lazy K派生でもない◆ ◆独自性重点◆ ◆純粋な◆ Hello, world! イヤーッ…

Freeモナドを使っている方、あるいはこれから使う方へ

FreeモナドのベースとなるFunctorは、GHCのDeriveFunctor拡張を使って、対象のデータ型にderiving Functorをつけることで 自 動 生 成 できます。 例 {-# LANGUAGE DeriveFunctor #-} import Control.Monad.Free data CharIOBase a = GetCh (Char -> a) | Pu…

Freeモナドでゲームを作ろう!第2回: 本当に動かす

連載目次 第0回: 概要 第1回: Gameモナドの基本 Haskellの力を最大限に引き出す 前回紹介したような関数の組み合わせでももちろんゲームは作れるのですが、今回は、さらにゲームを開発しやすくするための手法をいくつか紹介し、その例を実際に動かしてみます…