Concurrent Clean : 便利関数
ということで、関数適用、タプル、一意型、正格性などに関連する便利関数・演算子をいくつか定義した。これからは、これらを適宜使っていくことにする。
http://www.geocities.jp/lethevert/softwares/clean/customize.html <- ここに置いた。
/** Application **/ ($) infixr 0 //:: (a -> z) a -> z ($) f a :== f a ($$) infixr 0 //:: (a b -> z) (a,b) -> z ($$) f (a, b) :== f a b ($$$) infixr 0 //:: (a b c -> z) (a,b,c) -> z ($$$) f (a, b, c) :== f a b c ($$$$) infixr 0 //:: (a b c d -> z) (a,b,c,d) -> z ($$$$) f (a, b, c, d) :== f a b c d ($$$$$) infixr 0 //:: (a b c d e -> z) (a,b,c,d,e) -> z ($$$$$) f (a, b, c, d, e) :== f a b c d e /** Strictness **/ \!! :: !(!.a,!.b) -> (!.a,!.b) \!! (a,b) = (a,b) \!!! :: !(!.a,!.b,!.c) -> (!.a,!.b,!.c) \!!! (a,b,c) = (a,b,c) \!!!! :: !(!.a,!.b,!.c,!.d) -> (!.a,!.b,!.c,!.d) \!!!! (a,b,c,d) = (a,b,c,d) \!!!!! :: !(!.a,!.b,!.c,!.d,!.e) -> (!.a,!.b,!.c,!.d,!.e) \!!!!! (a,b,c,d,e) = (a,b,c,d,e) ($!!) infixr 0 ($!!) f (a,b) :== f $ \!! (a,b) ($!!!) infixr 0 ($!!!) f (a,b,c) :== f $ \!!! (a,b,c) ($!!!!) infixr 0 ($!!!!) f (a,b,c,d) :== f $ \!!!! (a,b,c,d) ($!!!!!) infixr 0 ($!!!!!) f (a,b,c,d,e) :== f $ \!!!!! (a,b,c,d,e) ($$!!) infixr 0 ($$!!) f (a,b) :== f $$ \!! (a,b) ($$$!!!) infixr 0 ($$$!!!) f (a,b,c) :== f $$$ \!!! (a,b,c) ($$$$!!!!) infixr 0 ($$$$!!!!) f (a,b,c,d) :== f $$$$ \!!!! (a,b,c,d) ($$$$$!!!!!) infixr 0 ($$$$$!!!!!) f (a,b,c,d,e) :== f $$$$$ \!!!!! (a,b,c,d,e) /** Unique Type **/ foldU :: (b a -> b) !b ![(.u -> (a, .u))] !.u -> (!b, !.u) foldU _ b [] u = (b, u) foldU f b [x:xs] u # (a, u) = x u = foldU f (f b a) xs u foldUwhile :: (b a -> b) !b ![(.u -> (Bool, a, .u))] !.u -> (!b, !.u) foldUwhile _ b [] u = (b, u) foldUwhile f b [x:xs] u # (c, a, u) = x u | c = foldUwhile f (f b a) xs u = (b, u) mapU :: ![(.u -> (a, .u))] !.u -> (![a], !.u) mapU [] u = ([], u) mapU [x:xs] u # (a, u) = x u # (as, u) = mapU xs u = ([a:as], u) mapUwhile :: ![(.u -> (Bool, a, .u))] !.u -> (![a], !.u) mapUwhile [] u = ([], u) mapUwhile [x:xs] u # (c, a, u) = x u | c # (as, u) = mapUwhile xs u = ([a:as], u) = ([a], u)
そういや、昔、オブジェクト指向スタイルの記述のために、下のような演算子を定義したんだけど、最近使ってないな。どうしようかな?
(-->) infixl 9 //:: a (a -> b) -> b (-->) a f :== f a