Tak, to jest:
chainl1 p op = foldl (flip ($)) <$> p <*> many (flip <$> op <*> p)
Chodzi o to, że trzeba przeanalizować p (op p)*
i ocenić go jako (...(((p) op p) op p)...)
.
To może pomóc rozszerzyć definicję trochę:
chainl1 p op = foldl (\x f -> f x) <$> p <*> many ((\f y -> flip f y) <$> op <*> p)
Jak par op
i p
są analizowane wyniki są stosowane natychmiast, ale ponieważ p
jest prawo operand op
, potrzebuje flip
.
Tak więc typ wyniku many (flip <$> op <*> p)
to f [a -> a]
. Ta lista funkcji jest następnie stosowana od lewej do prawej na wartości początkowej p
przez foldl
.
Czy chcesz wyjaśnić trochę więcej? Dlaczego foldl i flip? – adamse