Yasutaka Higa
x :: A
f :: A -> B
f(x) :: B
g :: A -> (A -> B) -> B
T A = {A1, A2, A3, ... }
data Delta a = Mono a | Delta a (Delta a)
>>=
として定義instance Monad Delta where
return x = Mono x
(Mono x) >>= f = f x
(Delta x d) >>= f = Delta (headDelta (f x))
(d >>= (tailDelta . f))
generator x = [1..x]
numberFilter xs = filter isPrime xs
count xs = length xs
numberCount x = count (numberFilter (generator x))
generator x = [1..x]
numberFilter xs = filter even xs
count xs = length xs
numberCount x = count (numberFilter (generator x))
generator x = Mono [1..x]
numberFilter xs = Delta (filter even xs)
(Mono (filter isPrime xs))
count x = Mono (length x)
numberCount x = count =<< numberFilter =<< generator x
*Main> numberCount 1000
Delta 500 (Mono 168)
*Main> numberCountM 10
DeltaM (Delta (Writer (4, ["[1,2,3,4,5,6,7,8,9,10]",
"[2,3,5,7]",
"4"]))
(Mono (Writer (5, ["[1,2,3,4,5,6,7,8,9,10]",
"[2,4,6,8,10]",
"5"]))))