2014-06-01から1ヶ月間の記事一覧

GADT記法+tagをC++で

GADTとは Generalized Algebraic DataTypes(GADT)と言うHaskellの記法(?)を知りました Haskellの入門書などで出てくるMaybe型は以下のような定義になっています data Maybe a = Nothing | Just a これをGADTで書くと以下のようになるそうです data Maybe a…

Haskellの<$>と<*>をC++で書いてみる

はじめに これは実用的でゎなぃ 無駄にcompile-timeを増やしているだけな気が もともとは<$>演算子と<*>演算子を定義できないかな? って思って試しに検討してみたものです C++では、オーバーロードできる演算子が制限されているので もちろんこんな事はでき…

勝手にplaceholderを補正してくれるbind

前回作ったmake_placeholderを利用したもの http://melpon.org/wandbox/permlink/gz7q4bMgPhLh9Xz7 Generic lambdaを使用したもの http://melpon.org/wandbox/permlink/KaCm31pYSekzuvSc 参考: http://d.hatena.ne.jp/osyo-manga/20131110/1384095746

N個のplaceholderを作って展開する

はじめに 任意の関数型変数を引き数として受取り、 第1引数を1にbindしてretrunする方法に関してのメモです template<typename R, typename A,typename... Args> auto bind_1_1(std::function<R(A,Args...) f> { return //std::bind(f,1,make_placeholders<Args...>{}...); //理想イメージ } int main() { std::function<int(int,int,int,int)> f = []</int(int,int,int,int)></args...></r(a,args...)></typename>…

memo

http://melpon.org/wandbox/permlink/mv3a6JZ7oiyWAGnL

HaskellをC++で書いてみる(getLineとputStrLineとIO型とMonad型クラス)

はじめに また性懲りもなく 今回は以前にもまして穴だらけですが いつか理解できるまでの手前用のメモとして IO型 (いつかリベンジしたい) Haskellでは以下のように定義されています --data IO a *->* newtype IO a = IO (State# RealWorld -> (# State# R…

constexprとlambda式

私的メモ clangとgccで挙動が全く違います しかも私自身規格を読んでいないので、 どちらが正しいのか全くわかっていません http://melpon.org/wandbox/permlink/lUzXqVVTIf7dglD9 あとで何とかする 追記:どうやらconstexprはリテラルでないといけなくて リ…

HaskellをC++で書いてみる(多相型(Maybe型)とFunctor型クラス)

はじめに 前回、単相型(具体型)とEq型クラスを作ったので 今回は多相型とFunctor型クラスを作成します 多相型(polymorphic type)に関して 例えばHaskellのList型は [1,2,3,4]でも[1.0,2.0,3.0,4.0]でも['1','2','3','4']でも どんな型でもListと呼ばれます…