Haskell

今のバージョンでYesodアプリを動かすまで

なんかうまく動かなくなってたので、メモ。 まずは、Haskell Platform を確認。 気がついたら64bitが入っていた。 多分 2012.4.0.0 にするときに誤って入れたらしい。 一旦今の Haskell 環境を消して、 $ sudo /Library/Haskell/bin/uninstall-hs --remove t…

同じようなフィールドを持ったレコードへの変換

RecordWildCards を使って、同じようなフィールドを持つレコードを簡単に変換できる。 RecordA.hs module RecordA where data A = A { a :: Int, b :: String, c :: Int } deriving Show RecordB.hs module RecordB where data B = B { a :: Int, b :: Strin…

Haskellの言語拡張たち 2

前のやつ の続き。 今回調べた拡張 レコード系 RecordWildCards 型系 ExistentialQuantification RecordWildCards レコードワイルドカードが使える。 レコードパターン中で .. とすれば、レコード内のフィールドを一気に束縛したり、現在のスコープの変数か…

一部の値を変更したレコード

Database.Persist.MySQLの設定を調べていて、こんな記述を発見。 defaultConnectInfo :: ConnectInfo Default information for setting up a connection. (中略) Use as in the following example: connect defaultConnectInfo { connectHost = "db.example.…

Haskellの言語拡張たち

前回、なんか拡張を沢山使っていたが、おまじないのままなのもそろそろまずい感じなので、とりあえず調べてみた。 今回調べた拡張 型系 GADTs ScopedTypeVariables EmptyDataDecls TypeFamilies 型クラス系 MultiParamTypeClasses TypeSynonymInstances Flex…

Haskell で DB操作

最近 Yesod を弄っているが、Yesod で使ってるやつ (Database.Persistent) を使って、普通に DB 操作したいな、と。 sqlite と mongodb をやってみる。github にあげた分 → https://github.com/rf0444/haskell-dbとりあえず自分の環境 (Mac) で runhaskell …

The End of Start Haskell

1/28 に、第6回 スタートHaskell に行ってきました!また1週間かかってしまった・・・遅延評価だから仕方がない (キリッ 12章 遅延評価 解説 @imsuten http://www.intransient.info/materials/Programming_in_Haskell_12/Programming_in_Haskell_12.html5.html#…

Purely Functional Data Structures読書会 第4回

1/21 に、Purely Functional Data Structures読書会 第4回 に行ってきました。 まとめ的な: http://wiki.haskell.jp/Workshop/ReadPFDS/4 3.4 (c) (d) @khibino 前回末尾再帰になっていなかったから、CPS変換して末尾再帰にしたらしい。 なんかいきなり継続…

Purely Functional Data Structures読書会 第3回

12/17 に、Purely Functional Data Structures読書会 第3回 に行ってきました。 開始前 Mac (Lion) のデスクトップ増やす: Mission Control から カーソルを右上の方にやると「+」が出てくる。 押すと増える。 Lion から操作が変わった部分は、わりと前から…

第5回 スタートHaskell

12/5 に、第5回 スタートHaskell に行ってきました! 会社の先輩 (@seizans) に誘われて、久しぶりの勉強会 & 初スタートHaskell! 前日 本の中身をざっくりみた後、演習をやっておこうとした。 環境をみてみると、Haskell Platform 入れてなくて、 Mac Por…

Maybe/Option のリストから普通のリストへ

Ocaml の時は自作したけど、Scala と Haskell は結構簡単にできる。 ↓Scala scala> List(Some(4), Some(2), None, Some(9), None, Some(0)) flatMap (x => x) res0: List[Int] = List(4, 2, 9, 0) ↓Haskell > [Just 4, Just 2, Nothing, Just 9, Nothing, Ju…

liftとか

liftで遊んでみる。 > :t map map :: (a -> b) -> [a] -> [b] > :t fmap fmap :: (Functor f) => (a -> b) -> f a -> f b > :t liftM liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r > :t liftM2 liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 …

関数合成・・・

. こわい。 > ((.) . (.)) succ (+) 1 2 4 > ((.) . (.)) length (++) "hoge" "piyo" 8 > ((.) (.)) (+) 1 succ 2 4

do みたいな for

Scala の for を Haskell の do みたいに使ってみる。 Haskell f :: Maybe Int -> Maybe Int -> Maybe Int f am bm = do a <- am b <- bm let c = a + b return (2 * c) > f (Just 3) (Just 1) Just 8 > f Nothing Nothing Nothing > f (Just 3) Nothing Not…

foldを使ってfoldを作る

foldr/foldl を使って、foldl/foldrを作ってみる。 myFoldL :: (a -> b -> a) -> a -> [b] -> a myFoldL f y xs = foldr (\x g a -> g $ f a x) id xs y myFoldR :: (a -> b -> b) -> b -> [a] -> b myFoldR f y xs = foldl (\g x a -> g $ f x a) id xs y -…

Yコンビネータ

フィボナッチと階乗やってみる。 > let y f = f $ y f > :i y y :: (b -> b) -> b -- Defined at <interactive>:1:4 > y (\f n -> if n < 2 then n else f (n-1) + f (n-2)) 7 13 > y (\f n -> if n < 2 then n else f (n-1) + f (n-2)) 100 Interrupted. ← (´・ω・`)ショホ</interactive>…

RWH 4章練習問題1

なんか作るのにすごい時間かかった・・・ リストを述語で分割 splitWith :: (a -> Bool) -> [a] -> [[a]] splitWith f [] = [] splitWith f xs = case span f xs of (a,b) -> a : (splitWith f $ snd $ span (not . f) b) > splitWith (/= 'a') "igaiahaidih…

リストとか

Scalaでやってたやつとか。 平方数 > take 10 $ zipWith (*) [1..] [1..] [1,4,9,16,25,36,49,64,81,100] > take 10 $ map (\x -> x * x) [1..] [1,4,9,16,25,36,49,64,81,100] 総和と総積 > foldl (+) 0 [1..10] 55 > foldl (*) 1 [1..10] 3628800 > foldl1…

中置関数

map とかって、中置で使うとOO系言語と逆になるんだよなぁ・・ > :info map map :: (a -> b) -> [a] -> [b] -- Defined in GHC.Base > (\x -> x + 1) `map` [1..10] [2,3,4,5,6,7,8,9,10,11] > succ `map` [1..10] [2,3,4,5,6,7,8,9,10,11] > let myMap a b …

Haskellやる!

Real World Haskell―実戦で学ぶ関数型言語プログラミング が研究室に入ったので、本格的に Haskell やってみようかと。 とりあえず、3章まで読んだ。 目指せリア充! (注:「Real World Haskell充」の略) 小ネタ: 3項演算子 > let (+++) a b c = a + b + c …