大抵,Yコンビネータには型推論はできない. でも例えばStandard MLの再帰関数を定義する機能を使えば楽々定義できる. fun Y f x = f (Y f) x fun fact_ fact x = (* この fact_ を "seed" と呼ぶ *) if x = 0 then 1 else x * fact (x-1) val fact = Y fact_ "Seed" にラッパをかぶせれば機能を楽に付加できる. fun printerWrapper f_ f x = let val result = f_ f x val _ = printInt result in result end val factPrint = Y (printerWrapper fact_) このfactPrintは再帰の途中経過を印字する. Haskellのように副作用をモナドで分離しなければな