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