Concurrent Clean : Haskell の $ 演算子

Haskellの $ 演算子が便利そうだと思っていたのだけれど、Cleanでも使えることが分かった。
こんな風に定義すればよい。(関数でもよかったが、効率性を考えてマクロにしてみた)

($) infixl 0 //:: (a -> b) a -> b
($) f a :== f a

で、使ってみた。一応、つり銭の組み合わせを求めるプログラムだ。

change :: Int [Int] -> [[Int]]
change _ []
	= []
change amount coins
	| amount < 0
		= []
	| amount == 0
		= [[]]
	| otherwise
		=  [[hd coins] ++ a \\ a <- change $ amount - hd coins $ coins]
		++ [a \\ a <- change amount $ tl coins]