2016-04-20 9 views

Antwort

1

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).

+1

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