Haskell

missngH ライブラリ

これは Haskell Advent Calendar 2012 の10日目用の記事です。missingH という Haskell のライブラリを調べてみました。続きは後で!(遅延します)

モナド則1が成り立たないと

以前「モナド則1(左単位元)を満たさない偽リストモナド」でモナド則1が成り立たないとどういうとき困るかを書いたのですが通常の場面では出てこないような例だったので別の例をあげます。あらためて偽リストモナドの定義を書くと import Monad(sequence)…

エラトステネスの篩

https://gist.github.com/803680 にインスパイアされて遅延評価を使う版を書いた。 primes = 2: sieve 3 (multiples primes) sieve x yys@(y:ys) | x == y = sieve (x+1) (dropWhile (== y) ys) | otherwise = x: sieve (x+1) yys multiples (x:xs) = xx: ms…

Arrow の first が満たすべき公理が式だけだとわかりにくいので図式にしてみる。

first と pure は図式の中では関手っぽさを出すため First と Pure のように先頭大文字にしてみた。多相なものには気分によって型を補足した。1.[拡張] first (pure f) = pure (f×id)Hom(X,Y) で X から Y への射の集まりを表すと (-)×id_D Hom(B,C) ---…

モナド則1(左単位元)を満たさない偽リストモナド

import Monad(liftM) data MyList a = My { unMy :: [a] } deriving (Show,Eq) instance Monad MyList where return x = My [x,x] (My xs) >>= k = My $ xs >>= (unMy.k) -- sample f x = My [x,x+1] とすると > return 2 >>= f My {unMy = [2,3,2,3]} > f 2…

モナド則3(結合律)を満たさない偽リストモナド

bind [] _ = [] bind [x] k = k x bind xs@(x:_) k = case k x of [_] -> xs >>= k otherwise -> reverse $ xs >>= k data MyList a = My { unMy :: [a] } deriving (Show,Eq) instance Monad MyList where return x = My [x] (My xs) >>= k = My $ xs `bind…

F-algebra と catamorphism を Haskell で理解する(2)

前回の続き。wikipedia の F-algebra のページ http://en.wikipedia.org/wiki/F-algebra 参照。上記ページに F(X) = 1 + X という関手の F-algebra の例で (N,[zero,succ]) が出てくる。Haskell で書くと type N = Int a :: Maybe N -> N a Nothing = 0 a (J…

F-algebra と catamorphism を Haskell で理解する

wikipedia の F-algebra のページ http://en.wikipedia.org/wiki/F-algebra 参照。 上記ページに集合圏から集合圏への関手F として F(X) = 1 + X という例がでてくるが 1 + X は Haskell では Maybe X である。 Maybe の定義 data Maybe a = Nothing | Just …

数独ソルバ

Haskell で数独ソルバを書いてみた。 特徴は ・明示的な再帰は使わず (iterate ...) !! 81 を使った。(81手目に解が求まる) ・探索中のマス目状態を、未確定部分と仮確定部分に分けて持つ。 import List (partition,delete) mark (pos@(i,j),d) cand = (…

List化関手同士の自然変換

・自然変換 Listのreverse リストの反転は自然変換になっているという初等的でありがたい例。 応用として、cdrとかもいいんじゃないかと発言したけど、空リストの扱いが困るから微妙。でも同じ感じで結構考えられそう。 http://d.hatena.ne.jp/oto-oto-oto/2…

公平に配る

Haskell で。Maybe 大好き。 import List import Maybe deal n xs = map catMaybes $ transpose $ init $ takeWhile (not.null) $ map (take n) $ iterate (drop n) $ replicate n Nothing ++ map Just xs ++ [Nothing]