30012013 Haskell
mkvhenvっていうmkvirtualenvに対応するコマンドを用意した。mkvirthualenvしたあとにworkhonするのはめんどくさかったので、かなり快適になった。
30012013 Haskell
mkvhenvっていうmkvirtualenvに対応するコマンドを用意した。mkvirthualenvしたあとにworkhonするのはめんどくさかったので、かなり快適になった。
Haskellなんかの型推論とか量子論をかじっているヒトが読むとかなり面白いと思う。述語理論、ゲーム理論、ゲーデルの不完全性定理なんかを説明して最後に確率的クリピキモデルに至るという内容。事例で金融の話が度々登場する。
僕はチューリングの定理(対角論法は知ってたけど)を理解できたのと、金融で不確定性原理が出てくるのが「原子の観測はミクロなのにマクロな市場でも表れるのか!」と驚いたが、結局介入しないと観測できないということから来てるんだろうなぁと解釈した。
他にはボトムの意味をもうちょっと深く理解したのが、意外な収穫。
ゲーデルの不完全性定理を知るには数学ガールが良いとおもう。
09012013 Haskell
今まで型宣言には具体的な型を書くものだと思っていたのだけど、型クラスを書いてもいいのね
myequal :: (Eq a) => a -> a -> Bool myequal a b = a == b
RWHの15.8(Hiding the IO monad)では型クラスを使って抽象化していた。
06012013 Haskell
Free Monadとは
さて、この「Freeモナド」について、オレオレ定義で簡単に言葉にすると。「Functorと組み合わせて様々な挙動を実現できるモナド」です。capriccioso String Creating(Object something){ return My.Expression(something); }
つまるところ
要はFree Monadは、Pureな値が何かの型によってリストのように順々にくるまれた構造をもつデータ型を表していて、Listにおけるfoldのような畳み込みと同様に、Impureな部分をたどっていってPureな部分に到達するまでfmapを繰り返して処理を行いますみょんさんの
もう少し圏論的な説明は
じゃあこの操作を普通の関手でもできるようにしてやろうということを考えると自然とFreeモナドが構成できる。直和が定義できる圏であれば、自由モノイドを作るのと同じ要領でモナドを作ればよい。北海道苫小牧市出身のPGが書くブログ
実際どう使うか
インターフェースを定義するみたいなイメージでいいのかな、Functorが具象クラスで。
RWHの15章を読みなおすのもいいらしい(これから読む)。
03012013 Haskell
Yesod本のBlogのExampleがyesod initでできるスキャフォールドとかけ離れていてわかりにくい。
Foundation.hsとかに丁寧なコメント書いてあるだろうっていうツッコミもあるだろうけど、写経できるに越したことはないよなぁと思う。
wikiのほうを先にやるかな。
02012013 Haskell
defaultLayoutがどうなっているのか気になったので、ソースコードを追いかけてみた。
messageの処理とwidget埋め込みをやるようになっていた。
defaultLayout :: GWidget sub a () -> GHandler sub a RepHtml defaultLayout w = do p <- widgetToPageContent w mmsg <- getMessage hamletToRepHtml [hamlet| $newline never $doctype 5 <html> <head> <title>#{pageTitle p} ^{pageHead p} <body> $maybe msg <- mmsg <p .message>#{msg} ^{pageBody p} |]
31122012 Haskell
Yesod本の写経。addJullius, AddHamletでtoWidgetを使えというdeprecated warningが出たので本家サイトのように書きなおした。
hamletはtoWidgetよりはwhamletのほうが見やすいかな。
{-# LANGUAGE QuasiQuotes, TypeFamilies, OverloadedStrings #-} {-# LANGUAGE MultiParamTypeClasses, TemplateHaskell #-} import Yesod data R = R mkYesod "R" [parseRoutes| / RootR GET /#String NameR GET |] instance Yesod R getRootR = defaultLayout $ do setTitle "Homepage" addScriptRemote "http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" toWidget [julius| $(function(){ $("#ajax a").click(function(){ jQuery.getJSON($(this).attr("href"), function(o){ $("div").text(o.name); }); return false; }); }); |] let names = words "Larry Moe Curly" [whamlet| <h2>AJAX Version <div #results> AJAX results will be placed here when you click # the names below <ul #ajax> $forall name <- names <li> <a href=@{NameR name}>#{name} <h2>HTML Version <p> Clicking the names below will redirect the page # to an HTML version <ul #html> $forall name <- names <li> <a href=@{NameR name}>#{name} |] getNameR name = do let widget = do setTitle $ toHtml name [whamlet|Looks like you have Javascript off Name: #{name}|] let json = object ["name" .= name] defaultLayoutJson widget json main = warpDebug 3000 R
29122012 Haskell
Yesodを使ってみて混乱したのがどこまでがHamletの構文でどこからがYesodの拡張なのだろうかというあたり。
WidgetsはYesodで追加された仕組みで、whamletとか^{footer}といった記法もYesodのものだと理解した。ついでにCore見て確認しておいた。
{-# LANGUAGE OverloadedStrings, TypeFamilies, TemplateHaskell, QuasiQuotes, MultiParamTypeClasses #-} import Yesod data Messages = Messages mkYesod "Messages" [parseRoutes| / RootR GET /set-message SetMessageR POST |] instance Yesod Messages where defaultLayout widget = do pc <- widgetToPageContent widget mmsg <- getMessage hamletToRepHtml [hamlet| $doctype 5 <html> <head> <title>#{pageTitle pc} ^{pageHead pc} <body> $maybe msg <- mmsg <p>Your message was: #{msg} ^{pageBody pc} |] instance RenderMessage Messages FormMessage where renderMessage _ _ = defaultFormMessage getRootR :: Handler RepHtml getRootR = defaultLayout $ do setTitle "My Page Title" toWidget [lucius| p { color: red; } |] toWidgetHead [hamlet| <meta name=keywords content="session sample">|] [whamlet| <form method=post action=@{SetMessageR}> My Message is: # <input type=text name=message> <input type=submit> |] postSetMessageR :: Handler () postSetMessageR = do msg <- runInputPost $ ireq textField "message" setMessage $ toHtml msg redirect RootR main :: IO () main = warpDebug 3000 Messages
Wisgetsのようにjs,css,htmlをまとめて管理できる仕組みはいいかもと思う反面、デザイナーとの分業って難しくなるんじゃないのかなぁと思うんだけどどうなんだろ?僕の場合は全部独りでやるからこういう仕組みのほうがあってるかなと思うんだけど。
それからcssの設定とか競合しないもんかね?
29122012 Haskell
高速だと言われているBlazeHtmlのチュートリアルをトレースしてみた。
{-# LANGUAGE OverloadedStrings #-} import Control.Monad (forM_) import Text.Blaze.Html5 import qualified Text.Blaze.Html5 as H import Text.Blaze.Html.Renderer.String numbers :: Int -> Html numbers n = docTypeHtml $ do H.head $ H.title "BlazeTest" H.body $ do p "A list of natural numbers:" ul $ forM_ [1 .. n] (li . toHtml) main :: IO () main = putStrLn $ renderHtml $ numbers 5
あれ、このヒトってHakyllの作者じゃないか。
APIドキュメント見たら、やはりHakyll.Web.Blazeで使えるようになっていた。
28122012 Haskell
Shakespearean Templatesを読んでいてHTML,CSS,Javaxcriptじゃなくてふつうの文字列でもデータ埋め込みが出来ることを知った。
{-# LANGUAGE QuasiQuotes, OverloadedStrings #-} import Text.Shakespeare.Text import qualified Data.Text.Lazy.IO as TLIO import Data.Text (Text) import Control.Monad (forM_) data Item = Item { itemName :: Text , itemQty :: Int } items :: [Item] items = [ Item "apples" 5 , Item "bananas" 10 ] main :: IO () main = forM_ items $ \item -> TLIO.putStrLn [lt|You have #{show $ itemQty item} #{itemName item}.|]
pythonのformatメソッドのように使えそうだ。