23072012 Haskell
ファイル操作とかディレクトリ操作はSystem.DirectoryかSystem.FilePath.Posixを探せばいい。
それからHakyllとかTemplate Haskellとかチェックし始めた。
23072012 Haskell
ファイル操作とかディレクトリ操作はSystem.DirectoryかSystem.FilePath.Posixを探せばいい。
それからHakyllとかTemplate Haskellとかチェックし始めた。
22072012 Haskell
PLEACのレシピ9.1 タイムスタンプをHaskellで書いてみたんだけどちょっとめんどくさかった(Pythonも日付はめんどくさいけど)。
import System.Posix.Files import System.Time import System.Posix.Types import System.Environment getTimes :: FilePath -> IO (ClockTime, ClockTime) getTimes fp = do stat <- getFileStatus fp return (toct (accessTime stat), toct (modificationTime stat)) toct :: EpochTime -> ClockTime toct et = TOD (truncate (toRational et)) 0 main :: IO () main = do (file:_) <- getArgs (atime, mtime) <- getTimes file print atime print mtime
getFileStatus関数で時間の情報はEpochTime型が返ってくるので、これをClockTime型に変換する
type EpochTime = CTime
EpochTimeはCTimeの別名なんだけど、CTimeはRealのインスタンスなのでtoRationalで有理数に変換してtruncateを通してIntegerに。
これをClockTime型のデータコンストラクタであるTODに通す。
ClockTime型の出力は
Sun Jul 22 09:10:59 JST 2012
もう少し細かく制御したい場合にはtoCalendarTime関数でCalendarTIme型に変換して望みのフォーマットにすればいい。
RWHの20.4にきちんと書いてあった。
19072012 Haskell
pleacの7.3を解いた
その後環境変数HOMEとLOGDIRを||で繋ぎたいなぁと思ったけど>>=は失敗を運ぶから使えないよなぁと思っていたらmplusがあったかと。
import Data.List.Split import Control.Applicative import Control.Monad import Text.Regex import System.Environment getpwnam username = do passwds <- map (splitOn ":") <$> lines <$> readFile "/etc/passwd" return (filter (\line -> (line!!0)==username) passwds) main :: IO () main = do (path:_) <- getArgs case matchRegexAll (mkRegex "^~([^/]*)") path of Nothing -> putStrLn path Just (_,uhome,subdir,cs) -> if length cs == 1 && length (cs!!0) /= 0 then do dir <- getpwnam (cs!!0) if (length dir) == 1 then putStrLn $ ((dir!!0)!!5) ++ subdir else putStrLn $ "Error: " ++ uhome ++ " not found" else do homedir <- lookup "HOME" <$> getEnvironment logdir <- lookup "LOGDIR" <$> getEnvironment case homedir `mplus` logdir of Just home -> putStrLn $ home ++ subdir Nothing -> putStrLn "Error: Env[HOME] not found"
これでHOMEが見つかればその後のLOGDIRは無視するし、見つからなければ評価される。
さらにliftM2で書きなおした
else do result <- liftM2 mplus (lookup "HOME" <$> getEnvironment) (lookup "LOGDIR" <$> getEnvironment) case result of Just home -> putStrLn $ home ++ subdir Nothing -> putStrLn "Error: Env[HOME] not found"
18072012 Haskell
IOの例外をキャッチしたくてはまった。
import System.Environment import Control.Exception import Prelude hiding (catch) import System.Exit main = do (file:_) <- getArgs catch (putStr =<< readFile file) $ \e -> return (e::SomeException) >> print ("Error on reading file: " ++ file) -- main = do -- (file:_) <- getArgs -- catch (putStr =<< readFile file) $ \_ -> print ("Error on reading file: " ++ file)
例外の型を指定しないといけないらしい。
17072012 Haskell javascript
ふとMonadiusを読んでみたら、昔はちんぷんかんぷんだったのがかなり理解できるようになったので、自分でも簡単なゲームでも書きたくなってsofを追いかけていたらいつの間にかfunctional reactive programmingの方面に迷い込んでいたらしい。
「Amazonポチッとボタン」もいつの間にか完了していた。
Node.jsにもreactive programmingありそうだよなと思って調べてみたら、Trigger と Stream ベースの Reactive スタイルについて考えるを見つけたのだけど面白そう。あとで追いかける。
そういえば、CTMCPでreactive programmingに触れてたような気がするんだけどなぁとパラパラめくってみたけど、見つけられなかった。
記憶がバグってたのかなぁ
16072012 Haskell
16072012 Haskell
liftIOって結局何のためにあるのかわからないので調べていたらliftとliftIOの違いがわかり易かった。
RWHによれば
liftIOはControl.Monad.IO.Class
class (Monad m) => MonadIO m where -- | Lift a computation from the 'IO' monad. liftIO :: IO a -> m a
参考
ちょっと前からReal World Haskell 3周目を読んでいて、最近読み終わった。
読み始める前のポストイット(理解が曖昧なところに貼ってある)
読後(かなり減った)
すごいHaskellのおかげで理解がすすんだとことが結構あって、それをテコにしてRWHの内容がすんなり理解できたりしたのが大きかったかも。
15072012 Haskell
Haskellで人工無脳をつくろうというものを書いてます。
参考にしている書籍は「恋するプログラム―Rubyでつくる人工無脳」なんですけどね。
Rubyの書籍は楽しい本が多いんだけど、絶版することも多いですね。
Rubyで作る奇妙なプログラミング言語も絶版だしねー
Pasec覚えるのに適当な言語のparser書くのも楽しいんだろうなーと思ったり、スタックを使った加減乗除を書いてみるのもよいだろうな。
12072012 Haskell
PLEACのファイルコンテンツの章が面白そうだったのでHaskellでやってます。
import System.IO import System.Environment import Control.Concurrent main = do args <- getArgs h <- openFile (args!!0) ReadMode loop h where loop h = do end <- hIsEOF h if end then (threadDelay 1000000) >> loop h else do c <- hGetChar h putChar c hFlush stdout loop h
sleepさせるのはSystem.PosixにもあったんだけどControl.ConcurrentのthreadDelayを使うほうがいいそうなんでそうしてみたけど理由はわからん。