してみた。 動機 スタックの操作を roll とか pop とか dup とか exch とか書いて頑張るのが煩わしかった。メタプログラミングによる解決が求められる。 Haskell による実装 最初はプリプロセッサを書くつもりでいたので。 module Stack where import Control.Applicative data Operation = OpPop | OpRoll Int Int | OpIndex Int deriving Show stackConv :: [Int] -> [Int] -> Maybe [Operation] stackConv from [] = Just $ map (const OpPop) from stackConv (f : fs) (t : ts) | f == t && (f `elem` fs || f `notElem