Concurrent Clean : Re: 小町算

[id:lethevert:20070718:p2]
k.inabaさんのアプローチhttp://www.kmonos.net/wlog/75.html#_1916070718で書いてみた。

module Main2
extension for-notation

import StdBase, OptEnv, StdUtil

Start w
    # a = [1,2,3,4,5,6,7,8,9] |> number |> flatmap term |> flatmap expr
          |> filter oneElm |> flat |> filter ((==) 100)
    = for w
        f <- stdio
        f = f $> length a $> newline
        _ <- fclose f
        return

f gg [] = [[]]
f gg [a] = [[a]]
f gg [a,b:c] = [[a:x] \\ x <- f gg [b:c]]
            ++ flatmap (f gg) [[g a b:c] \\ g <- gg]

number = f [\a b = a*10+b]
term = f [(*),(/)]
expr = f [(+),(-)]

flat = foldr (++) []
flatmap f = flat o (map f)

oneElm [a] = True
oneElm _ = False