Думаю, стоит посмотреть на определение: instance Monoid b => Monoid (a -> b) where mempty _ = mempty -- If `b` has a specialised mconcat, use that, rather than the default -- mconcat, which can be much less efficient. Inline in the hope that -- it may result in list fusion. mconcat = \fs x -> mconcat $ map (\f -> f x) fs {-# INLINE mconcat #-} mempty выдаёт функцию, которая игнорирует a и всегда выдаёт дефолтное значение (нейтральный элемент) типа b. mconcat берёт список функций fs и аргумент x :: a. Далее к каждой функции f из fs вычисляем f x, результат конкатенируем. Иными словами mconcat [f₁, f₂, …, fᵢ, …, fₙ] x = (f₁ x) <> (f₂ x) <> … <> (fᵢ x) <> … <> (fₙ x) Следовательно, что же будет результатом f = (+1) <> (+2)? f x = (x + 1) <> (x + 2) Поведение этой функции зависит от того, как определён моноид для типа a (x :: a). Допустим, x :: Sum Int, тогда f x будет буквально означать 2x + 3 Допустим, x :: Product Int, тогда f x будет означать (x + 1) * (x + 2). Возможно, вы хотите сделать композицию функций, чтобы получить (+3). Тогда в этом вам поможет оператор (.).
не компилируется, потому что вы пытаетесь склеить моноидом разнородные сущности — функцию и число. значение не вычисляется, отличу что тут нет никакого значения
я понял в чем проблема: числовые значения делятся на два моноида Sum и Prod. Из головы вылетело, спасибо что напомнили. Вот что мне нужно и работает inc1:: Sum Int -> Sum Int inc1 x = Sum 1 + x inc2:: Sum Int -> Sum Int inc2 x = Sum 2 + x
ошибки две: 1. одну ты уже сам заметил, для чисел есть больше одного моноида (и их даже не два), и поэтому нужно указывать явно ньютайпом 2. вторая - у <> сигнатура :: a -> a -> a - то есть оба аргумента и результат в одном типе, но ты пытаешься склеить функцию и число
Вторая ошибка вызвана фактом, что я работаю с аппликативными фунцторами где операция <*> включает и термин
Обсуждают сегодня