Да, это:
chainl1 p op = foldl (flip ($)) <$> p <*> many (flip <$> op <*> p)
Идея состоит в том, что вы должны проанализировать p (op p)*
и оценить его как (...(((p) op p) op p)...)
.
Это может помочь немного расширить определение:
chainl1 p op = foldl (\x f -> f x) <$> p <*> many ((\f y -> flip f y) <$> op <*> p)
Поскольку пары op
и p
анализируются, результаты применяются немедленно, но поскольку p
является правильным операндом op
, ему необходим flip
.
Итак, тип результата many (flip <$> op <*> p)
равен f [a -> a]
. Этот список функций затем применяется слева направо к начальному значению p
на foldl
.