2011-12-26
Haskell Platform 2011.4.0.0をいれたよ!
Haskellのwebフレームワークyesodをいれようと思ったらattoparsecまわりの依存関係で怒られてインストールできず。(とあるライブラリはattoparsec0.10以上が必要だけど別のライブラリは0.10未満が必要なので競合するとかそんな感じで怒られた。ヤムチャ言いやがって・・・。)
解決しようと模索しているうちにだんだんゴチャゴチャになってきたので、いっそHaskell環境まっさらにすることに。
今月リリースしたばっかりの、Haskell Platform 2011.4.0.0 64 bit をmac(雪豹)に入れました。
ダウンロードはここから。Download Haskell
前まで2.0.xだったのに、いきなり4.0.0に。3どこいってもうたんや。
たぶん今回からだと思うのだけど、アンインストールのコマンドが用意されていた。
下記コマンドを叩くと、過去のバージョンのghc(7.0.3以下)と、cabal install してきたライブラリを全消去できる。
$ sudo /Library/Haskell/bin/uninstall-hs thru 7.0.3 --remove
これ便利!
なぎはらえる!!
2011-12-21
定数固有メソッド実装
Enumで抽象メソッドを定義して、それを定数ごとにOverrideできるってことを、今日Effective Java読んではじめて知りました。
定数固有メソッド実装というらしい。かっこいい。
具体的にはこんな書き方ができる。
package jp.ne.hatena.syoko_sasaki; public enum Character { AZU { @Override String mederu(String name) { return name + "にゃんぺろぺろ"; } }, RUIZU { @Override String mederu(String name) { return name + "!" + name + "!" + name + "!" + name + "ぅぅうううわぁああああああああああああああああああああああん!!! あぁああああ…ああ…あっあっー!あぁああああああ!!!" + name + name + name + "ぅううぁわぁああああ!!!"; } }; abstract String mederu(String name); }
Java書き始めて2年半たつけど知らなかった・・・。
Effective Javaしっかり読もう。おもしろいし。
2011-11-10
剰余もfor文も使わないでHaskellでfizzbuzzを書いてみた
遅延評価バンザイヽ(^o^)丿
fizz = cycle ["","","fizz"] buzz = cycle ["","","","","buzz"] fizzbuzz = zipWith fb [1..100] $ zipWith (++) fizz buzz where fb n a | a == "" = show n | otherwise = a
cycleは循環リストを作る関数なので、GHCiでなにげなく試すとけっこう慌てる。
2011-11-09
windowsでHaskellのIOまわりで日本語を文字化けなく表示させる方法
ghc7.0.2
utf8-stringをインストール。
こちら参照
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/utf8-string
cabal install utf8-string
System.IO.UTF8のモジュールを見ると、だいたいIO周りが揃っている!
appendFile hGetLine openBinaryFile readFile getContents hPStr print readLn getLine hPStrLn pStr withBinary hGetContents interact pStrLn writeFile
試しに
Prelude> import System.IO.UTF8 as S Prelude System.IO.UTF8> S.writeFile "test.txt" "にゃん"
うまくいった!
2011-10-11
CSVファイルで各行の先頭を見て、重複した値があったら取り出すスクリプト
業務で必要になったので、勉強がてらHaskellで書いてみた。
import Data.List.Split main = do csv <- readFile "./foo.csv" print $ check $ dataList csv --各行の先頭をリスト化する dataList :: String -> [String] dataList csv = foldr (\x xs -> (head (splitOn "," x)) : xs) [] (lines csv) --リスト内に重複したデータがあるかチェック check :: [String] -> [String] check [] = [] check (x:xs) | elem x xs = x : (check xs) | otherwise = check xs
lines csv
行ごとにリストにする処理がたったこれだけで書けるのにちょっぴり感動した。