はわわーっ

はわわわわっ

haskell

trifectaでスタイルの設定とか

やってみた。 とりあえず動くようになったけど、いろいろ間違ってるかもしれない。。。トークンパーザにコメントを解釈させるようにする。 trifectaにはParserっていうのがあるけど、コメントは設定できないっぽいので自分で型を作る必要がある。 {-# LANGUA…

GeneralizedNewtypeDerivingする

GeneralizedNewtypeDerivingでさよならボイラープレート - 厨二病患者のプログラミング入門みてやってみた。 {-# LANGUAGE GeneralizedNewtypeDeriving #-} import Control.Applicative newtype Foo a = Foo { foo :: Maybe a } deriving (Eq, Monad, Functo…

Lensにさわってみた

Lensをちょっと触ってみた。 詳しく知らないけど、getterとかsetterとかオブジェクト指向的なことができるライブラリらしい。 ekmett/lens · GitHubのREADMEに書いてたものの一部ををそのまま実行しただけ。まず、インポートする。 > import Control.Lensget…

scheme処理系っぽいもの

やってみた。 簡単な計算とdefineとlambdaくらいならできてるっぽい。 module Main where import Control.Monad.Identity import Control.Monad.State import Data.Maybe import System.IO import Text.Parsec import Text.Parsec.String import qualified T…

QuickCheckのArbitraryのやつ

QuickCheckでテストに使われるランダムな値の設定とか。 QuickCheckを使うには Test.QuickCheck モジュールが必要。 参考: 本物のプログラマはHaskellを使う - 第17回 QuickCheckでデータ駆動型テストを行う:ITpro 本物のプログラマはHaskellを使う - 第18…

cabalでビルドとテスト

ちょっと前にHaskellの単体テスト最前線 - あどけない話を読んで試してみようと思ってたのをやってみた。ディレクトリ構成は hello/ hello.cabal src/ Hello.hs test/ HelloSpec.hs Spec.hsこんな感じ。ファイルの中身は -- src/Hello.hs main :: IO () main…

Parsec で JSON をパースする

Parsec の練習に JSON パーサを作ってみた。 import Numeric (readSigned, readFloat, readHex) import Text.ParserCombinators.Parsec data JValue = JNull | JBool Bool | JString String | JNumber Double | JArray [JValue] | JObject [(String, JValue)…

Stateモナドでモナド変換子を使ってみる

Stateモナドを使ってモナド変換子のお勉強。 前回みたいにスタックの pop と push を作る。 で、そのときにメッセージを表示するようにしてみる。 import Control.Monad.State pop :: StateT [Int] IO Int pop = do (x:xs) <- get put xs liftIO $ putStrLn …

Stateモナド使ってみる

State モナドを使ってみる。 import Control.Monad.State すると使えるようになる。State モナドは State s a みたいになっているらしい。 s が状態で a が状態付き計算の結果。 実際使うときには \s -> (a, s) を state で包んでやればいいらしい。 とりあ…

gtk2hs を使ってみる

gtk2hs を使ってみた。arch linux だとパッケージがあるので $ sudo pacman -S gtk2hs-buildtools haskell-gtkで簡単にインストールできる。 前 cabal でインストールしようとして挫折してたのでパッケージがあるのはいいね。とりあえずサンプル。ボタンをク…

brainf*ck インタープリタを作ってみた

やってみた。 import Data.Char (chr) import System.IO readBF :: FilePath -> IO String readBF file = do com <- readFile file return $ filter (`elem` "><+-.,[]") com brainfuck :: String -> String brainfuck com = reverse $ interp com (repeat 0…

数独を解く

数独を解くやつを作ってみた。 import Data.List (intersperse, union) import System.IO readBoard :: FilePath -> IO [[Int]] readBoard file = do rows <- fmap lines $ readFile file let conv = map (read . (\x -> if x == "." then "0" else x)) . wo…

Haskell で n-queens problem

やってみた。とりあえず、最初に書いてみたのがこれ。全パターンを抜き出してからフィルターするやつ。 import Control.Monad (replicateM) queens :: Int -> [[Int]] queens n = [qs | qs <- replicateM n [1..n], test qs] where test qs = not (hasSameEl…

二分木を折り畳む

Haskell で二分木(http://ja.wikipedia.org/wiki/二分木)を作ってみる。 data BTree a = Empty | Node a (BTree a) (BTree a) deriving Show 二分木の例。 tree :: BTree Int tree = Node 3 (Node 1 (Node 4 Empty Empty) (Node 7 Empty Empty)) (Node 6 (…

Haskell で確率計算

すごいH本の最後の方にあるやつ。まず型を定義する。 import Data.Ratio newtype Prob a = Prob [(a, Rational)] deriving Show 確率は Data.Ratio を使って表すことにする。使い方はこんな感じ。 data Coin = Heads | Tails deriving (Show, Eq) coin :: Pr…

quot と rem と div と mod

商と余りを求める関数に quot と rem や div と mod があるけど、違いがわからなかったのでまとめてみる。型は同じで quot :: Integral a => a -> a -> a rem :: Integral a => a -> a -> a div :: Integral a => a -> a -> a mod :: Integral a => a -> a -…

haskell でグループ分け

9人を2,3,4人のグループに分ける方法が何通りあるか、みたいなやつ。 > group [2,3,4] "abcdefghi" ["ab","cde","fghi"],["ab","cdf","eghi"],["ab","cdg","efhi"], ... ]まず、グループから n 人を選ぶ関数 combinations を作る。選んだ n 人と残りをタプル…

arrow 使ってみる

Haskell の Arrow の使い方とか。といっても、よくわかってないので Control.Arrow の関数をいくつか使ってみるだけ。Arrow は今のところ、タプルに関数を作用させる時に便利になるくらいのイメージ。まず、first と second。 first :: Arrow a => a b c -> …

もう少し順列

haskell で順列を列挙するやつ。選んだ要素と残りの要素を両方とも持っておかないといけないので、ペアを使うことにする。まず、残ってるやつから1つ選ぶ関数を作る。 pickup :: [a] -> [([a], [a])] pickup xs = [([head s], f ++ tail s) | i <- [0..lengt…

haskell で順列とか組み合わせとか

Data.List に permutations ってのがあるけど、P(n, k) 的なものとか組み合わせはないので作ってみた。まず、permutations を使ってみる。 import Data.List main = do print $ permutations "abcd" print $ length $ permutations "abcd" ["abcd","bacd","c…

haskell で乱数

乱数を使ってみる。とりあえず、System.Random をインポート。 import System.Random 乱数は random と getStdRandom を使えばよい。型はそれぞれ random :: RandomGen g => g -> (a, g) getStdRandom :: (StdGen -> (a, StdGen)) -> IO a となっている。例…

haskell の const

Prelude に const という関数がある。型は const :: a -> b -> a 簡単に言うと、引数を2つとって1つ目の引数をそのまま返す関数。 Prelude> const 1 2 1これと id を組み合わせてみると、引数を2つとって2つ目をそのまま返すようになる。 const id :: a -> b…

haskell で素数リスト

こんなかんじにやればいいらしい。 primes = 2 : primes' where primes' = 3 : sieve 0 5 sieve i x = filter isPrime [x,x+2..p*p-2] ++ sieve (i+1) (p*p+2) where (ps, p:_) = splitAt i primes' isPrime x = all ((/= 0) . mod x) ps 素数むずい。参考: …

再帰とかパターンマッチとか

haskellのお勉強。再帰とか使って関数を作ってみるよ。中身は標準にあるやつとだいたい同じだと思うよ。 maximum' :: (Ord a) => [a] -> a maximum' [] = error "empty" maximum' [x] = x maximum' (x:xs) = max x (maximum' xs) replicate' :: Int -> a -> …

タプル使うよ

タプルはリストと違って型が違うものを一緒にすることができる。あと要素数が違ったり、要素の型が違うものは別の型として扱われるみたい。 main = do print $ fst (1,"one") -- 1 print $ snd (1,"one") -- "one" print $ zip [1,2,3,4,5] [0,0,0,0,0] -- […

リストするよ

いろんなリストを作るよ。リスト内包表記とか便利だよ。 main = do print $ [1..10] -- [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] print $ [2,4..20] -- [2,4,6,8,10,12,14,16,18,20] print $ [20,15..1] -- [20,15,10,5] print $ take 10 [3,6…

リスト使うよ

haskellのリストの入門的ななにか main = do print $ [1,2,3] ++ [4,5,6] -- [1,2,3,4,5,6] print $ [1,2,3] ++ [4] -- [1,2,3,4] print $ 0:[1,2,3] -- [0,1,2,3] print $ [1,2,3,4] !! 0 -- 1 print $ [1,2,3,4] !! 3 -- 4 print $ [[1,2,3],[4,5,6],[7,8,…

haskell するよ

すごいH読みつつ haskell の勉強するよ。この本は最初のうちはghciで動かしてるんだけど、quickrunしたほうがやりやすいのでghciは基本使わない方向で。まず、hello world main = putStrLn "hello, world" 数とかリストとか文字列とかをとりあえず表示したい…