Ich hatte vor kurzem die Idee, eine Monade zu bauen, die die Anzahl der Bindungen zählt, die eine Berechnung durchläuft. Ich kam mit der folgenden auf:Wie erstellt man einen Pfeil, der "Verbindungen zählt"?
newtype K a = K { runK :: Int -> (a, Int) }
instance Functor K where
fmap f k = K $ \s ->
let (iv, s') = runK k s
in (f iv, s')
instance Applicative K where
pure x = K $ \s -> (x, s)
f <*> b = K $ \s ->
let (f', s') = runK f s
(ih, s'') = runK b s'
in (f' ih, s'')
instance Monad K where
return x = K $ \s -> (x, s)
a >>= f = K $ \s ->
let (iv, s') = runK a s
in runK (f iv) (s' + 1)
die später erkannte ich war nur der State
Monade und nicht sehr interessant. Dann hatte ich die Idee zu versuchen, einen Pfeil zu bauen, der "Verbindungen" zählte. Hier bin ich ein bisschen ratlos.
newtype L a b = L { runL :: Int -> (a -> b, Int) }
instance Category L where
id = arr Prelude.id
b . a = L $ \s ->
let (f1, s') = runL a s
(f2, s'') = runL b s'
in (f2 Prelude.. f1, s'' + 1)
instance Arrow L where
arr f = L $ \s -> (f, s + 1)
first a = L $ \s ->
let (f1, s') = runL a s
in (\(x, y) -> (f1 x, y), s')
kam ich mit dem, über den würde die Anzahl der Verbindungen zählen, aber die Anzahl der Verbindungen eine Berechnung geht nicht durch zählen. Vorschläge?
In Ihrer Definition der Kategorie L, warum geben Sie 's '' + 1 'statt' s '' + s'' zurück? Die Asymmetrie sticht nur als merkwürdig hervor. – ErikR
Ihre 'Monad' -Instanz für' K' ist nicht gesetzestreu. Zählbindungen können nicht sein, weil einige Gesetze eine unterschiedliche Anzahl von Bindungen auf den zwei Seiten der Gleichung haben, z. 'zurück x >> = f = f x'. Das Zählen von Verwendungen von '.' in einer' Kategorie' hat ein ähnliches Problem, da 'id. f = f 'ist eine Gleichung. –
Verwandte Frage: http://stackoverflow.com/questions/20292694/how-to-write-a-monad-that-prints-step-i-of-n-when-executing-each-statement-in/20293615 – danidiaz