Hatena::ブログ(Diary)

プログラミングお勉強きろく RSSフィード

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

これ便利!

なぎはらえる!!



あとLion完全対応したとの噂なので、これを機にアップデートしようかな。

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

行ごとにリストにする処理がたったこれだけで書けるのにちょっぴり感動した。

checkは再帰で書いたけれど、もう少し考えれば高階関数使って書けそうだな。