Складки над функциями - моноиды

Почему сгиб над длиной списка не является моноидом?

length = foldr (\_ n -> 1+n) 0

Разве он не ассоциативен и имеет нейтральный элемент 0, так что он должен быть моноидом?


person fragant    schedule 12.07.2015    source источник
comment
fold не является типом данных, так что он не может быть моноидом... Вы имели в виду, почему числа не являются моноидами?   -  person mniip    schedule 12.07.2015
comment
Я имел в виду, что складку можно применять к конструкциям, которые могут строить моноиды или даже не   -  person fragant    schedule 12.07.2015
comment
Тогда вы спрашиваете, является ли список моноидом? Да, это.   -  person mniip    schedule 12.07.2015
comment
Определение моей лекции гласит: Величина М с бинарной операцией (о) :: М х М -> М называется моноидом, если операция (о) ассоциативна и существует нейтральный элемент е. Таким образом, примером структуры, которая не создает моноид, является папка, применяемая к (\_ n -> 1+n) 0, которая является определением функции длины. Но почему это именно пример противоположного определения? я наполняю его   -  person fragant    schedule 12.07.2015
comment
Папка @fragant, применяемая к (\_ n -> 1+n) 0, имеет тип [a] -> Integer, это действительно не моноид.   -  person mniip    schedule 12.07.2015


Ответы (1)


Мне трудно понять, о чем вы на самом деле спрашиваете, и у меня есть подозрение, что точная формулировка утверждения из вашей лекции может иметь значение.

Но в самой интуитивной интерпретации я могу думать, что вы правы, поскольку математически функция length является «гомоморфизмом моноидов», отображающим моноид списков с операцией конкатенации в моноид целых чисел с операция сложения.

Технически это не так в Haskell, но в основном по той причине, что числовые типы не имеют экземпляра Monoid, потому что есть две очевидные операции на выбор: сложение и умножение. Другая причина в том, что списки в Haskell могут быть бесконечными, поэтому length не всегда дает результат.

person Ørjan Johansen    schedule 12.07.2015