Haskell

YonedaとCoYoneda、そしてFunctor

本当は、Freeモナドを超えた!?operationalモナドを使ってみよう http://fumieval.hatenablog.com/entry/2013/05/09/223604に影響されて、Operationalモナドの話をまとめようと思ったのですが、ちょっと時間なさそうだったので、今日はちょっとCoYonedaの話…

こもなど!コモナド!Comonad!!

どうも。 清く正しいHaskell戦士ちゅーんさんです。今日はアレです。Comonadやってきます。 えー・・・ 「こ」 「コ」 「Co」 Coってなんすか。カレーハウスっすか。丸い響きの音を付けて可愛く見せれば良いと思ってるんですか。 いやいや、騙されませんよ、…

Profunctorを咀嚼する

先週のekmett勉強会でliyanghuさんが紹介して下さったprofunctorがちょっと興味深いので、まだ完全に飲み込めては居ないのですが、簡単に纏めてしまおうと思います。さて、我々にとってFunctorと言えば「fmap :: (a -> b) -> f a -> f b」というメソッドを持…

LensちゃんマジLens

なんとゆーか、もともと手元にあるものを使ってちくちく何かをするのが好きなので、有名なライブラリとか大きいパッケージとか見ても尻込みしてしまってなかなか手を付けられないタイプなのですが、ここへ来て色々後回しにしてたツケが回ってきた感あります…

たなかさんのおにくをたべよう

Haskell界の有名なエンジニアで、「すごいH本」ことすごいHaskellたのしく学ぼうの翻訳もされている田中英行さんのご自宅にて、少人数のハッカソン「たなかにくまつり」が開催されたので参加して来ました。開催されるまでの経緯とか色々あるのですが、とにか…

いつだってInfinity

Infinityの頭文字はIです。即ち、無限大の愛です。 なんでも無いです忘れてください。今回もちょいと軽めの話をしましょう。Haskellの特徴として、遅延評価に加えて、正規形と見なされる制約に「弱頭部正規形」を採用しているという特徴があります。 これは…

Haddockでお手軽ドキュメント作成(仮)

静的型付けの関数型言語で「設計」と言えば、「型設計」の事になりまして、変に頑張ってOfficeツール*1で文章書いたりとかするより、スタブコードべろべろ書いてコンパイルが通った時点でそれを元にドキュメントを書き起こしたほうが圧倒的に正確だし効率が…

A HASKELL ADVENTURE IN WINDOWS(超訳)

Haskellでゲームを作るのは良いんだけど、Windowsでも動作するようにはしたいよなぁとは思っているので、その方法についてあちこち調べ回っていて、hackageのSDLのページからリンクをたどってたどり着いたANIMAL-MACHINE.COMというサイトのA HASKELL ADVENTU…

Haskellでチャーチ数

色々と記事にしたいネタはあるのですが、どれもちゃっちゃと書ける感じでは無いので、今日はちょっと小ネタ更新します。前々から、「チャーチ数とかHaskellなら簡単に表現できんじゃね?」とか思ってたのですが、どうやってshowするか思いつかないし考えるの…

Freeモナドって何なのさっ!?

最近Haskellerの間でFreeモナドが熱いです。 Haskellで悟りを開いた人がFreeモナドで再び悟りを開いたりして、なんかよく解らないけど凄いことになっている今日このごろですが、すっかり乗り遅れていました。どうも、貴女のちゅーんです。 で、皆こぞって「…

Haskellでゲーム開発 - SDL-Imageで画像を表示

とりあえず、ゲームを作るなら画像が描画できなくては話になりませんね。 というワケで、どうやってSDLで表示した画面に画像を表示するかという話を書きます。 もともとSDLにはBMPを操作するための関数が用意されていたりしますが、対応してるフォーマットが…

Haskellでゲーム開発 - メインループとイベント操作

そろそろHaskellでゲーム開発なんか真面目にやっていこうかなぁとか思いつつ、SDLの勉強しています。 並行してやってる色んな事を総スルーしながら、やっていきます。気分屋なのでやることがコロコロ変わるのは悪いくせですね、はい。 というわけで、Haskell…

CUI超お手軽英語辞書

巷で「すごいH本」と話題の「すごいHaskell楽しく学ぼう」をAmazonで購入しようと思ったのですが、思いの外人気らしくて、入手に時間がかかりそうでした。すごいHaskellたのしく学ぼう!作者: Miran Lipovača,田中英行,村主崇行出版社/メーカー: オーム社発売…

何故、関数型言語Haskellを学んでいるのか #fpstudy

大阪で開催された「第一回関数型言語勉強会」に発表者として参加してきました。 その準備等の関係で、しばらくダイアリーが付けられていませんでしたが、ちまちま再開していこうと思います。会場のGoogleマップが別の場所を指していたり、そもそも降車駅を間…

Haskellコードゴルフ:サイコロ問題

リスト内包表記を使えば、「サイコロを3回振った時の組み合わせ」のような、組み合わせのリストを作ることができます。 Prelude> [[x,y,z]|x<-[1..6],y<-[1..6],z<-[1..6]] [[1,1,1],[1,1,2],[1,1,3],[1,1,4],[1,1,5], 〜略〜 ,[6,6,5],[6,6,6]]数の組み合…

ポイントフリースタイルの歪んだ美

例えば、xを2倍してshowする関数fを考えます。 素直に書けば次のようになるでしょう。 Prelude> let f x = show (x * 2) Prelude> f 5 "10"こういったシンプルな処理は、ポイントフリースタイルにするのがHaskellらしいプログラミングですね。 Prelude> let…

Haskellでチューリングマシン(4) 命令の実行処理を作成

前回、テープの走査をモナドに包む時に、テープの値と一緒に、「ヘッドのステータス」を状態として保持できるようにしました。 この値は単なるInt型として実装したのですが、明確なアイデンティティを与えるため、HeadStateという別名を付けました。 --ヘッ…

Arrowの基本(3) |||演算子で条件分岐

Arrowの基本、三本目の記事は、Arrowが関数を繋いでいく流れの中で条件分岐を作り出す ||| 演算子の再実装をしていきます。 Prelude Control.Arrow> :i (|||) class (Arrow a) => ArrowChoice a where ... (|||) :: a b d -> a c d -> a (Either b c) d -- D…

Haskellでチューリングマシン(3) モナドを使ってどうするか

チューリングマシンを作るに当たって、テープを操作する処理をモナドにするというのを試みたわけですが、もとよりモナドの使い方がよく解っていないため改めて見返すとなかなか酷い出来です。結局、自分でもしっくり収まっていなかったのでしばらく停滞して…

状態系モナドの作り方

よく言われている事ですが、モナドには副作用を再現する「状態系モナド」(IO、State等)と、値が無い状態や計算の失敗を扱う事ができる「失敗系モナド」(Maybe、List等)の二種類に大別できます。今回の題材は、「状態系モナド」を扱います。 状態系モナド…

Arrowの基本(2) 関数を並列に繋ぐ ***、&&& 演算子

前回からの変更点: 実際の実装に合わせて、各MyArrowクラスから関数を取り出す関数は MyArrow型クラスに定義したrunArrでは無く、各型定義のアクセサ関数を使うようにします。 module Main where --Arrow型クラス class MyArrow a where myarr :: (b -> c) …

Arrowの基本(1) >>>演算子で関数を繋ぐ

前々から気になっていたArrowを覚えるべく、あちこち資料を探してみたものの、そもそも日本語の資料が少ないので。自分で色々いじって試してみる事にしました。 一つの日本語資料として活用できるように、手順を追って何回かに別けてなるべく詳細に書いてい…

Haskellで普通にFizzBuzz

深い意味は無いです、そういえば書いたこと無かったなぁと思ったので・・・ module Main where fizzbuzz :: Integer -> String fizzbuzz x | x `mod` 15==0 = "FizzBuzz" | x `mod` 3==0 = "Fizz" | x `mod` 5==0 = "Buzz" | otherwise = show x main :: IO …

型の練習

ネタが無いのでnewtypeの練習で書いたコードを晒します。 module Main where --単価 newtype Price = Price Int deriving (Eq,Show,Read) instance Num Price where _ + _ = error "You can`t calculate Price + Price" _ - _ = error "You can`t calculate …

データ構成子とか関数合成とか

リストを引数として受け取り、head関数を適用した後Foo型構成子に放りこんで返すheadFoo関数を考えます。 module Main where data Foo a = Foo a deriving Show headFoo a = Foo (head a)ここで、データ構成子Fooは「a -> Foo a」という関数と見なせるので、…

Haskellでチューリングマシン(2) テープの処理をモナドに

前回のエントリのテープに対する処理を、モナドに包んだだけです。 module Machine(TapeValue(..)) where --テープの値は 0 または 1 data TapeValue = T0 | T1 deriving Eq instance Show TapeValue where show T0 = "0" show T1 = "1" --無限長の長さを持…

Haskellでチューリングマシン(1) 無限の長さのテープを作る

そろそろ簡単なテストコードを書き連ねるより、それなりの規模のものを一つ作ってみるのが良いと思ったので、タイトルの通り、チューリングマシンのエミュレーターを作ってみる事にしました。Haskellもまだそんなに使いこなせてないうえに、チューリングマシ…

Haskellで新しい型を定義する

そもそも、今日はderivingについて書こうと思っていたのですが、その前に型を作る段階で一つ記事が書けるレベルの内容だったので、まずはちょっとした型を定義してみる事にします。 module Main where --型 Bar を作成 newtype Bar = Bar Int deriving (Eq,R…

モナドをたしなむ

以前のエントリにてHaskellで、簡単なモナドを使って動かしたりしてみましたが、今回はもうちょっとモナドの世界に突っ込んでみようかと思います。と、思って意気揚々とvimを立ち上げたのですが、恥ずかしながらそもそも型クラスやデータ構成子をちゃんと理…

IOモナドとdo記法

まずはじめに、HaskellでのHelloWorld。 module Main where main :: IO () main = print "Hello,World!"この"()"というのが気になったのですが、どうやらちゃんとPrelude(?)で定義されているようです。 Prelude> :i () data () = () -- Defined in GHC.Un…