16122009 Haskell
6.3まで。隣り合ったマスを再帰でマークしていくあたりとか、おーなるほどと。この章はコード書くときの流れ的なものが感じられておもしろいです。
あとこれって3次元に拡張すれば、結構簡単に蛋白質のリガンド結合ポケットの穴をグリッドで表現出来そうじゃんと。今度やってみようかな。再帰は素敵だ。
16122009 Haskell
6.3まで。隣り合ったマスを再帰でマークしていくあたりとか、おーなるほどと。この章はコード書くときの流れ的なものが感じられておもしろいです。
あとこれって3次元に拡張すれば、結構簡単に蛋白質のリガンド結合ポケットの穴をグリッドで表現出来そうじゃんと。今度やってみようかな。再帰は素敵だ。
16122009 Haskell
今週末は娘が昼寝をしなかったので、自分の時間がほとんどとれず。 しかも今日などは娘は寝なかったのに僕のみお昼寝をするという失態をやらかしてしまった。
やらかしたというよりはプログラム・プロムナードの2006年2月号を読んでうーんとうなっているうちに睡魔に襲われ、落ちてしまったというところ。
16122009 Haskell
下の感じのコードを書いたら、
do let ...
if ... then
...
else
...
インデント間違えてへんか?みたいなエラーが出まして、どうも、elseは ifよりも下げないといけないようだ、Haskell的には。
なんでifとelse揃えたらあかんのやー
WikiBookのdo within ifってところに書いてあった。doのなかでインデント揃えちゃうと;が入ってるものとみなされるから
do { first thing
; if condition
; then foo
; else bar
; third thing }
と解釈されてしまうらしい。
16122009 Haskell
perlでいうところのLWPでいいのかな。標準では入ってなかったのでここから。windowsにはdarcs入れてなかったのでlinuxの方にインストール
$ darcs get http://darcs.haskell.org/http/
$ runhaskell Setup.lhs configure
$ runhaskell Setup.lhs build
$ runhaskell Setup.lhs install
これでOK。あとはtestデイレクトリにget.hsっていうサンプルがあるので、コンパイルして動かしてみる。そのあとソースを眺めて理解する(それはこれから)
で、その後RESTなURIにでもアクセスしてみて受け取ったXMLをパースしてみる予定。
余談だが、fedora8だとdarcsはyumから入れられる。
yum install darcs
でオッケーだったような。
ghcをインストールしようとしたらperl5.8が必要らしい。 perl5.10をdeactivateしてからperl5.8をactivateしたら
$ sudo port activate perl5.8
---> Activating perl5.8
Error: port activate failed: Image error: /opt/local/bin/corelist already
exists and does not belong to a registered port. Unable to activate port perl5.8.
こういう場合には
$ sudo port -f activate perl5.8
$ sudo port install ghc
perlを5.10にもどす
$ sudo port deactivate perl5.8
---> Deactivating perl5.8
$ sudo port activate perl5.10
---> Activating perl5.10
これでOK
16122009 Haskell
Haskell - WikiBookを読んでる。
継続のあたりまで進んだのだけど、動かすのに困ったのでメモ。説明は分かりやすかった。あと、Haskell-modeはミニバッファに型が出てきて便利。いちいち:tとかやって確認するの面倒だし。
import Control.Monad.Cont
foo :: Int -> Cont r String
foo n =
callCC $ \k -> do
let n' = n ^ 2 + 3
when (n' > 20) $ k "over twenty"
return (show $ n' - 4)
-- runCont (foo 5) id
そしてさらに、Haskellの継続モナド(Continuation Monad)を理解するポイントも併せて読んで吉。
wikibookはarrowのとことかも分かりやすかった。
うーん両方とも欲しい
Real World Haskell―実戦で学ぶ関数型言語プログラミング
Scalaスケーラブルプログラミング[コンセプト&コーディング] (Programming in Scala)16122009 Haskell
普段やるようなことをHaskellで書くようにすればよかろうとHaXmlとhttpをつかってみた。
ほとんどhttpのテストサンプルのget.hsだけど。HaXmlのほうはHaXml の Combinators を使って XML をいじるを参考にした。
import Data.Char (intToDigit)
import Network.HTTP
import Network.URI
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)
import Text.XML.HaXml
import Text.XML.HaXml.Xml2Haskell
import Text.XML.HaXml.Pretty
main =
do
args <- getArgs
case args of
[addr] -> case parseURI addr of
Nothing -> err "Could not parse URI"
Just uri -> do
cont <- get uri
elems <- fGetElem "test" cont
mapM_ (print . content) $ (deep $ tag "title") elems
_ -> err "Usage: get <url>"
err :: String -> IO a
err msg = do
hPutStrLn stderr msg
exitFailure
get :: URI -> IO String
get uri =
do
eresp <- simpleHTTP (request uri)
resp <- handleE (err . show) eresp
case rspCode resp of
(2,0,0) -> return (rspBody resp)
_ -> err (httpError resp)
where
showRspCode (a,b,c) = map intToDigit [a,b,c]
httpError resp = showRspCode (rspCode resp) ++ " " ++ rspReason resp
request :: URI -> Request
request uri = Request{ rqURI = uri,
rqMethod = GET,
rqHeaders = [],
rqBody = "" }
handleE :: Monad m => (ConnError -> m a) -> Either ConnError a -> m a
handleE h (Left e) = h e
handleE _ (Right v) = return v
fGetElem fname cont = return (CElem elems)
where Document _ _ elems _ = xmlParse fname cont
xmlParseにファイル名入れなきゃいけないので適当に名前をいれといた。
xmlParse :: String -> String -> Document To parse a whole document, xmlParse file content takes a filename (for generating error reports) and the string content of that file. A parse error causes program failure, with message to stderr.
なんか良く分からんが。
実行するとタイトルだけ抜き出すはず。
$ ./rssparse http://clip.livedoor.com/rss/clips/fmkz336
<title>fmkz336のクリップ - livedoor クリップ</title>
<title>haxml.pdf (application/pdf オブジェクト)</title>
<title>CategoryBinaries - DarcsWiki</title>
<title>PLEAC-Haskell</title>
<title>AIRアプリはドラッグ&ドロップでこんなことまで!(1/3) ─ @IT</title>
<title>Javascript でタートルグラフィックス - 言語ゲーム</title>
<title>[Haskell][30分プログラム]テトリスっぽい何か</title>
<title>ほにゃ。</title>
<title>はたしてバイオはオープンか?(Re:研究とかをオープンにすること) - バイオ研究者見習い生活 with IT</title>
<title>[REST][書きかけ][WebService][SOAP] RESTful な blast 検索サービスを作るとしたらどうするかを考えてみた</title>
<title>こういうことがしたいんだけど - 刺身☆ブーメランのはてなダイアリー</title>
<title>Version Control with SVK</title>
<title>svkでもう少し攻めてみる</title>
<title>Programming:WayToHaskeller</title>
<title>TM23Proof.pdf (application/pdf オブジェクト)</title>
<title>サーバーのリソースを定期的に取得する - Hatena::Diary::Ubuntu</title>
<title>モナドのすべて - Enjoy Programming</title>
<title>howm wiki - モナド</title>
<title>好きなフォント</title>
<title>Pexpect - a Pure Python Expect-like module</title>
<title>wxPython Cookbook - wxPyWiki</title>
HTTPのほうは読めば分かりそうなもんだけど、HaXmlはなかなか簡単なサンプルがなかったので難儀した。