import Control.Category
data St a b = St (a -> (b, St a b))
ap :: St a b -> [a] -> [b]
ap _ [] = []
ap (St f) (a:as) = let (b, nSt) = f a in b : ap nSt as
integral
:: Num a
=> St a a
integral = from 0 where
from n = St $ \x -> st x where
st x = let s = x + n in (s, from s)
instance Category St where
-- id :: St a a
id = St
$ (\x
-> (x
, id)) -- (.) :: St b c -> St a b -> St a c
(.) (St f) (St g) = St $ \x -> compose x where
compose x = (x2, f1 . g1) where
(x1, g1) = g x
(x2, f1) = f x1
main = do
print $ ap
(integral
. id) [0,1,2] == ap
(id . integral
) [0,1,2] print $ ap
(integral
. (const 42 . integral
)) [0,1,2] == ap
((integral
. const 42) . integral
) [0,1,2] print $ ap integral
[0,1,2,3] == [0,1,3,6]
aW1wb3J0IFByZWx1ZGUgaGlkaW5nIChjb25zdCwgaWQsICguKSkKaW1wb3J0IENvbnRyb2wuQ2F0ZWdvcnkKCmRhdGEgU3QgYSBiID0gU3QgKGEgLT4gKGIsIFN0IGEgYikpCgphcCA6OiBTdCBhIGIgLT4gW2FdIC0+IFtiXQphcCBfIFtdID0gW10KYXAgKFN0IGYpIChhOmFzKSA9IGxldCAoYiwgblN0KSA9IGYgYSBpbiBiIDogYXAgblN0IGFzCgpjb25zdCA6OiBhIC0+IFN0IGIgYQpjb25zdCB4ID0gU3QgJCBcXyAtPiAoeCwgY29uc3QgeCkKCmludGVncmFsIDo6IE51bSBhID0+IFN0IGEgYQppbnRlZ3JhbCA9IGZyb20gMCB3aGVyZQogIGZyb20gbiA9IFN0ICQgXHggLT4gc3QgeCB3aGVyZQogICAgc3QgeCA9IGxldCBzID0geCArIG4gaW4gKHMsIGZyb20gcykKCmluc3RhbmNlIENhdGVnb3J5IFN0IHdoZXJlCiAgLS0gIGlkIDo6IFN0IGEgYQogIGlkID0gU3QgJCAoXHggLT4gKHgsIGlkKSkKICAtLSAgKC4pIDo6IFN0IGIgYyAtPiBTdCBhIGIgLT4gU3QgYSBjCiAgKC4pIChTdCBmKSAoU3QgZykgPSBTdCAkIFx4IC0+IGNvbXBvc2UgeCB3aGVyZQogICAgY29tcG9zZSB4ID0gKHgyLCBmMSAuIGcxKSB3aGVyZQogICAgICAoeDEsIGcxKSA9IGcgeAogICAgICAoeDIsIGYxKSA9IGYgeDEKCm1haW4gPSBkbwogIHByaW50ICQgYXAgKGludGVncmFsIC4gaWQpIFswLDEsMl0gPT0gYXAgKGlkIC4gaW50ZWdyYWwpIFswLDEsMl0KICBwcmludCAkIGFwIChpbnRlZ3JhbCAuIChjb25zdCA0MiAuIGludGVncmFsKSkgWzAsMSwyXSA9PSBhcCAoKGludGVncmFsIC4gY29uc3QgNDIpIC4gaW50ZWdyYWwpIFswLDEsMl0KICBwcmludCAkIGFwIChjb25zdCA0MikgWzAsMSwyXSAgPT0gWzQyLDQyLDQyXQogIHByaW50ICQgYXAgaW50ZWdyYWwgWzAsMSwyLDNdID09IFswLDEsMyw2XQogIA==