free の検索結果:

動的配列の無難なHaskell実装

…したい。 追記 バージョン0.0.1で、ロックフリー版のatomicPushとatomicPopを追加した。 *1:改めて確認すると、grow-vector: Mutable vector with efficient appendsというパッケージが最近アップロードされたようだ *2:Damian Dechev, Peter Pirkelbauer, and Bjarne Stroustrup - Lock-free Dynamically Resizable Arrays

最強にして最速のビルダー、mason

…ilderの実体は、Freeモナドのような再帰的なADTにコンストラクタを重ねる関数であり、構築・分解するオーバーヘッドが大きいのだろう——結局、中間構造を作らないという目的を完全に達成したわけではないのだ。 type BuildStep a = BufferRange -> IO (BuildSignal a) -- | 'BuildSignal's abstract signals to the caller of a 'BuildStep'. There are -- …

特級シリアライズライブラリ、winery 1.0解禁

…t,splett0@free.fr,Male,-222,53.3928271,18.3836801 2,Mata,Snead,msnead1@biblegateway.com,Male,-816,51.5141668,-0.1331854 3,Levon,Sammes,lsammes2@woothemes.com,Male,485,51.6561,35.9314 ... -} 結果は以下の通りだ。wineryがダントツで速いだけでなく、生成されるバイト列も最も短い。 enco…

Elias-Fano encoding: 単調増加する数列をほぼ簡潔に表現する

… UV.unsafeFreeze {-# INLINE fromStream' #-} maxValue | V.null vec = 1 | otherwise = V.last vec + 1 efWidth = max 1 $ ceiling $ logBase 2 (fromIntegral maxValue / fromIntegral efLength :: Double) {-# SPECIALISE unsafeFromVector :: UV.Vector …

ステートマシン猛レース

…たのはtubesだ。Freeモナドをベースにした基本を押さえたAPI、リストモナド相当のSourceに加えContravariantなSinkと第一印象は良いが、さすがに10万倍も遅いと実用的とは言いがたい。 scanT :: Monad m => (b -> a -> b) -> b -> Tube a b m x scanT f = go where go b = await >>= \x -> let !b' = f b x in yield b' >> go b' s…

快速のExtensible effects

…ように使える。これをFreeモナドと組み合わせたモナドEffを導入し、liftいらずにしようという試みだ。 実装はextensible-effectsパッケージとして存在する。アクションがTypeableであることを要求する、データ型が不必要に再定義されているなど、やや引っかかりはある。特に、Typeableの制約ゆえに、多相なアクションはEffに持ち上げることができず、MonadStateのような関数従属性もない。計算量のオーダーの改善のため「慈悲なき反省」*2を起用してい…

Haskellでオブジェクト指向を再発明する

…States m, FreeGame m) => Actions a -> m a handle GetCoord = use position handle Update = do d <- use direction n <- use animation p <- use position translate p $ bitmap $ playerBitmap (n `div` 5) d handle (Move d) = do case d of L -> positi…

Haskell Advent Calendar 13日目: シンセサイザーで理解するArrowプログラミング

…り止めたりするためにFreeモナドが登場します。 type Playlist r = Free (PlaylistF r) start :: Artery IO () r -> Playlist r ClipId stop :: ClipId -> Playlist r () wait :: Float -> Playlist r () runPlaylist :: Given SampleRate => Playlist r Void -> Artery IO () [r]…

Operationalモナドをゲームに応用した話

…して扱う方法として、FreeモナドとOperationalモナドがある。ここでは、Operationalモナドをゲームのキャラクターの制御に用いた例を紹介する。Freeモナドの導入については、Andres Löh氏のHaskell eXchange 2013の講演がわかりやすく、おすすめである。 データを作る アクションゲームの敵の動きとして、この二つを考えよう: 待機 接近(攻撃) 索敵(プレイヤーの位置を調べる) EnemyMというモナドがあれば、Haskellの値として…

モナドの六つの系統[Functor x Functor]

…M, ST, Q, Freeなど 現実を含む、世界に作用できる特殊なモナド。Haskellにおける、副作用を表現する唯一の方法である。 putStrLn :: String -> IO () (固有アクション)現実世界の標準出力に文字列を送る。 getLine :: IO String (固有アクション)現実世界の標準入力から、一行分の文字列を取り出す。 unIO :: IO a -> (State# RealWorld -> (# State# RealWorld, a #…

Freeモナドを超えた!?operationalモナドを使ってみよう

…か月前なら、 それ、Freeモナド*1でできるよ! と返されるだろう。だが今は違う。Freeモナドよりも簡単にモナドを作れるモナド、Operationalモナドがあるのだ。 Freeモナドについて復習しよう。FreeモナドはFunctorを基にMonadを作れる構造であり、Functorで自分自身を包むことによってモナドの力を得ている*2。FunctorそのものはDeriveFunctor拡張を使って簡単に作れる。 {-# LANGUAGE DeriveFunctor #-}…

Indexed Monadの世界

…を手に入れたのだ。 Free indexed monad モナドに対してFreeモナドがあるように、インデックス付きモナドにもインデックス付きFreeモナドがある。早速作ってみよう。 {-# LANGUAGE GADTs #-} data IxFree f i j x where Pure a :: a -> IxFree i i a Free :: f i j (IxFree f j k a) -> IxFree f i k a パラメータが増えた点を除けば普通のFreeモ…

Freeモナドでゲームを作ろう!第3回: Haskellは手続き型言語

※最新のfree-gameを想定しているので、古いバージョンを使っている方は今すぐアップグレード(cabal update && cabal install free-game)してください。 7週間以上開きましたが、第3回です。ここからはどんどんプログラムを組み上げていきます。 コードが長くなったのでGitHubに上げました。重要な所に絞り、どのようにしてプログラムを組むかを解説していきたいと思います。 当たり判定について(Collision.hs) 説明が面倒なので省略。…

Freeモナドを使っている方、あるいはこれから使う方へ

FreeモナドのベースとなるFunctorは、GHCのDeriveFunctor拡張を使って、対象のデータ型にderiving Functorをつけることで 自 動 生 成 できます。 例 {-# LANGUAGE DeriveFunctor #-} import Control.Monad.Free data CharIOBase a = GetCh (Char -> a) | PutCh Char a | EmbedIO (IO a) deriving Functor t…

Freeモナドでゲームを作ろう!第2回: 本当に動かす

…バイスを頂いたので、free-game 0.9ではlinearを採用しました。零次元から四次元までの範囲でベクトルや行列の操作ができる、非常に便利なライブラリです。二次元に絞って主要な関数をいくつか紹介しておきます。 V2 :: a -> a -> V2 a -- コンストラクタ zero :: V2 a -- 零ベクトル negated :: V2 a -> V2 a -- 反転 (^+^) :: V2 a -> V2 a -> V2 a -- 加算 (^-^) :: V2…

Freeモナドでゲームを作ろう!第1回: Gameモナドの基本

…基本 (この記事) free-gameを使う さて、みなさん、free-gameはインストールしましたか?まだの型方も、もうインストールした方も、本日free-gameを更新したのでcabal update && cabal install free-gameしましょう。 2013/5/6: free-game 0.9.3をリリースし、内容も改訂しました。必ずcabal update && cabal install free-gameしてください。 free-gameは、G…

Freeモナドでゲームを作ろう!第0回: 概要

…ナドの基本 先ほど、free-gameというライブラリをアップロードしました。free-gameは、世界で一番柔軟かつ簡単にゲームなどのGUIを作れるライブラリを目指しています。 Freeモナドとは Freeモナドは、Functorを与えると自動的にモナドを生成してくれる構造で、これを使うことで、アクションをデータの一つとして柔軟に扱えるようになります。去年の10月ごろからにわかに日本のHaskeller間で流行り始めた、今一番熱いモナドです[要出典]。Freeモナドそのもの…

究極のモナド「Idealモナド」を垣間見る(続/その0)

…ナド」を垣間見るではFreeモナドを構成して興奮して終わってしまったが、今回はイデアルモナドの仕組みについてもう少し考えてみる。 data Ideal f a = Pure a | Ideal (f a) Idealモナドは、純粋な値Pure aか、fというなにかに包まれているIdeal (f a)のどちらかを取る、という仕組みになっている。returnはPureに、何らかの作用を持つアクションはIdealに行く─純粋かそうでないかを分離することが、イデアルモナドの本質を表し…

究極のモナド「Idealモナド」を垣間見る

…に関して一般化する、Freeモナドという構造がある。 さらにFreeモナドを一般化すると…Idealモナドになるのだ。 発端 自由モナドの一般化のイデアルモナドというものがあるらしいのでふみさんには是非これにも取り組んでほしい bit.ly/Wn5Arc— Hiromi Ishii (@mr_konn) January 3, 2013 イデアルモナド!?なにそれかっこいい! そして、私の長い旅が始まる… 定義 Monads and More: Part 2によれば、 An i…

Freeモナド実用の旅(5): MonadPlus for Free

…MonadPlus.Freeはいなくなりました えにっきをみてください freeの新バージョンにControl.MonadPlus.Freeなるものがあったのでさっそく使ってみた。MonadPlus版Freeのコンストラクタは、Pure、Freeに加えて新たにPlusが加わっており、任意のFunctorからMonadPlusなモナドを生成することができる。 以下は、Freeモナドによって錬成されたパーサコンビネータの例。 import Control.Monad import…

Freeモナド実用の旅(4): FreeなReader、Writerモナド

…nad.Trans.Free type ConveyorT a = FreeT ((->) a) type GeneratorT a = FreeT ((,) a) ask :: Monad m => ConveyorT r m r ask = liftF id tell :: Monad m => w -> GeneratorT w m () tell a = liftF (a, ()) runConveyorT :: Monad m => ConveyorT r m a …

Freeモナド実用の旅(3): TimeMachineモナド

…nad.Trans.Free import Control.Monad.Trans import Control.Monad newtype Ticket = TicketId {getTicketId :: Int} deriving (Eq, Ord, Show) data Train a = Ticket (Ticket -> a) | Departure Ticket a | Station Ticket a | Skip Ticket a a instance Fu…

Freeモナド実用の旅(2): Gotoモナド

…nad.Trans.Free import Control.Monad.Trans newtype Label = LabelId Int deriving (Eq, Ord) data Labeling a = Label (Label -> a) | Goto Label -- deriving Functorがあれば不要 instance Functor Labeling where fmap f (Label g) = Label (f . g) fmap f (Go…

Freeモナド実用の旅(1): ループからのBreak

とても簡単。Free(T)に「続きがない」ということを表すFunctorをはめるだけ。 ex1はある文字列を入力すると終了するプログラム。 import Prelude hiding (break) import Control.Monad.Trans.Free import Control.Monad.Trans import Control.Monad data Zero a = Zero deriving (Show, Eq, Ord) instance Functor…

そろそろFreeモナドに関して一言いっとくか

Freeモナドはすごい。Haskellを書いていて、「特殊化された処理を記述するモナドが簡単に作れたら便利だろうなー」と思ったことはないだろうか?簡単に作れるのである、そう、Haskellならね。これが、純粋なFreeモナドの定義である。 data Free f a = Pure a | Free (f (Free f a)) instance Functor f => Monad (Free f) where return = Pure Pure a >>= k = k a…