<*> [1, 2, 3]
output: [3, 5, 7]
Я его переписал в префиксный стиль (простите за замозоленные глаза):
fmap (.) $ (<*>) [(+1)] ((<*>) [(*2)] [1,2,3])
ИЛИ
(<*>) [(.)] ((<*>) [(+1)] ((<*>) [(*2)] [1,2,3]))
Оно сломалось, ругается в частности на [(+1)], выкидывая ошибку:
• No instance for (Num (b0 -> c0)) arising from a use of ‘+’
(maybe you haven't applied a function to enough arguments?)
Если же убрать fmap (.) $, то все хорошо работает (output: [3, 5, 7]), что значит, что я правильно транслировал инфикс в префикс, до момента с аппликацией (.).
Подскажите, как же правильно транслировать запись:
pure (.) <*> [(+1)] <*> [(*2)] <*> [1, 2, 3]
в полный префикс?
Код из контекста про закон аппликативного функтора о композиции:
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
(<*>) левоассоциативна, а вы переписали так, будто она правоассоциативна
Юрий, спасибо... Когда поэтапно описывал ассоциативность, оказывается, я спутал правое с левым: ( pure (.) <*> ( [(+1)] <*> ( [(*2)] <*> [1, 2, 3] ) ) )
pure (.) <*> [(+1)] <*> [(*2)] <*> [1, 2, 3] == (<*>) (pure (.)) ((<*>) [(+1)] ((<*>) [(*2)] [1, 2, 3]))
Обсуждают сегодня