タグ

ブックマーク / mkotha.hatenadiary.org (3)

  • GHCで動くcall/ccの実装 - www.kotha.netの裏

    IOモナド上で動作するcall/ccを実装できることが分かったので書いておく。ただし実用に耐えるものではない。 これを使うとたとえばこういうコードを書くことができる。 import Control.Applicative import Control.Monad import Data.IORef import System.IO.Unsafe import Continuation (callCC, withContinuationsDo) test :: IO () test = do r <- callCC $ \cc -> return $ Right $ cc . Left case r of Left val -> do putStrLn $ "left: " ++ show val return () Right cc -> do putStrLn "right" cc "f

    GHCで動くcall/ccの実装 - www.kotha.netの裏
  • RULESによるコンパイル時プログラミング - www.kotha.netの裏

    これはHaskell Advent Calendar 2013の(3+π)日目の記事です。 (3 + pi)や(quot 7 8)のような単純な定数式は、ghc -Oが行なう定数畳み込みによってコンパイル時に計算される。uncurry (*) (3, max 5 2)のようなやや複雑な式も、インライン展開してから定数畳み込みをすることでやはりコンパイル時に整数リテラルにまで簡約される。 これは一見万能だが、再帰的な関数が一つでもあると何もできなくなる。GHCが再帰関数をインライン化しないからだ。(sum [1])ですら実行時のループにコンパイルされる*1。 どうしてもコンパイル時に計算してほしい関数がある場合はどうしたら良いか。一つの方法はTemplate Haskell(ja)を使うことだが、特別な構文を使わなければいけないこと、-fwarn-unused-binds(ja)をはじめとし

    RULESによるコンパイル時プログラミング - www.kotha.netの裏
  • doの乱用 - www.kotha.netの裏

    メモ。 Haskell Reportによれば、(do a)という式の意味は(a)と同じなので、aがモナドな型を持っている必要はない。これを利用して、括弧を減らすためだけにdoを使うことができる。 import Data.Complex import Data.Monoid import Data.Text.Lazy.Builder import Data.Text.Lazy.Builder.RealFloat -- | 普通 complexInPolar :: Complex Double -> Builder complexInPolar x = fromString "(" <> realFloat (magnitude x) <> fromString ":" <> realFloat (phase x) <> fromString ")" -- | doの乱用 complexInP

    doの乱用 - www.kotha.netの裏
  • 1