Die Liste Monad ist given here. Siehe auch Spivaks paper here. Also Liste ist eine Monade. Ist es ein Comonad? Wie würdest du das beweisen?Ist die Liste eine Monade und comonad?
Antwort
Der Listentypkonstruktor lässt keine comonad-Struktur zu. Daran erinnern, dass, wenn es ein comonad waren, hätten wir (mit den Namen von Haskell Functor
und Comonad
typeclasses)
fmap :: ∀ a b. (a → b) → [a] → [b]
extract :: ∀ a. [a] → a
duplicate :: ∀ a. [a] → [[a]]
Aber auch ohne Gesetze gehen in allen benötigten, extract
kann nicht umgesetzt werden, da sein Eingang sein könnte die leere Liste, die keine Möglichkeit gibt, mit einer a
zu kommen.
Die nicht-leere Liste Typkonstruktor a ↦ μ NE. a + a * NE
hat eine Struktur comonad zugeben, mit extract
das erste Element zurückkehrt, und duplicate
Mapping [x, y, ..., z]
zu [[x], [x, y], ..., [x, y, ..., z]]
(man beachte, dass jede von ihnen durch die Konstruktion nicht leeren sind).
Dieses "Duplikat" folgt fast keinem der Gesetze von Comonaden. Ein richtiger (der nicht eindeutig ist) ist etwas wie '[x0..xn] -> [[x0..xn], [x1..xn, x0] .. [xn, x0..xn-1]] '. – mnish
Sie können für endliche Listen keinen Extrakt "[a] -> a" definieren. – Lee