= Z | S Peano
data Vec (n :: Peano) a where
VNil :: Vec 'Z a
VCons :: a -> Vec n a -> Vec ('S n) a
Он очевидно функтор, чуть менее очевидно аппликативный (зиппер). На первый взгляд (и на второй, но может я чего не вижу) -- не монада. Как это можно внятно обосновать кроме "ну у всех инстансов которые я придумал законы не выполняются"? Или всё-таки монада и я недодумал?
Он аппликативный только если из него аналог ZipList сделать. А не-монада он, потому что n должно быть фиксировано тогда.
Не осмыслил. n как раз таки фиксирован в типе (>>=) :: Monad (Vec n) => Vec n a -> (a -> Vec n b) -> Vec n b. Собственно потому из него монада и не получается (по крайней мере у меня в голове). Но я пока не построил логическую цепочку от одного к другому, поэтому и вопрос.
Чисто логически нет вменяемого способа сделать это для простоянного n
Монада: join ((a,_), (_,b)) = (a,b)
Да, действительно, законы вроде выполняются. Недодумал.
Поясните плиз что тут написано. Я тут вижу инстанс монады для newtype Foo a = Foo (a, a), но это явно не то
гомогенная пара — это Vec 2, по аналогии можно продлить до любого размера
Как уже сказали псевдокод для гомогенной пары (и N-тупли, конечно)
Обсуждают сегодня