The Haskell definition of Applicative seems to rely on the existence of exponential objects. If you encode Applicative by its liftA2 form (or liftA2 (,)) you just need products, and you get something like a lax monoidal functor.<br>
<br><div class="gmail_quote">On Fri, Feb 18, 2011 at 5:32 PM, Permjacov Evgeniy <span dir="ltr">&lt;<a href="mailto:permeakra@gmail.com">permeakra@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
let&#39;s assume following definitions (record members and parametrs with<br>
laws that must hold are dropped for simplicity)<br>
<br>
record categoryOps {oℓ aℓ : Level}<br>
  (obj : Set oℓ)<br>
  (_⇒_ : obj → obj → Set aℓ) : Set (oℓ ⊔ aℓ) where<br>
 field<br>
  id   : {o : obj} → o ⇒ o<br>
  _∘_  : {x y z : obj} → x ⇒ y → y ⇒ z → x ⇒ z<br>
<br>
record functorOps {oℓ₁ aℓ₁ oℓ₂ aℓ₂ : Level}<br>
  (obj₁ : Set oℓ₁)<br>
  (_⇒₁_ : obj₁ → obj₁ → Set aℓ₁)<br>
  (cat₁ : categoryOps obj₁ _⇒₁_)<br>
  (obj₂ : Set oℓ₂)<br>
  (_⇒₂_ : obj₂ → obj₂ → Set aℓ₂)<br>
  (cat₂ : categoryOps obj₂ _⇒₂_)<br>
  : Set (oℓ₁ ⊔ aℓ₁ ⊔ oℓ₂ ⊔ aℓ₂) where<br>
 field<br>
  liftO : obj₁ → obj₂<br>
  liftA : {x y : obj₁} → x ⇒₁ y → liftO x ⇒₂ liftO y<br>
<br>
<br>
monad can be codified with easy as it is simply an endofunctor with two<br>
special types of arrows<br>
<br>
record monadOps {oℓ aℓ : Level}<br>
  (obj : Set oℓ)<br>
  (_⇒_ : obj → obj → Set aℓ)<br>
  (cat : categoryOps obj _⇒_)<br>
  (fun : functorOps obj _⇒_ cat obj _⇒_ cat)<br>
  : Set (oℓ ⊔ aℓ) where<br>
 open functorOps fun<br>
 field<br>
  liftV : {o : obj} → o ⇒ liftO o<br>
  join  : {o : obj} → liftO (liftO o) ⇒ liftO o<br>
<br>
comonads can be codified in similiar way. However, &#39;applcative&#39; cannot.<br>
The haskell base uses  function with type<br>
<br>
Applicative f =&gt; f (a -&gt; b) -&gt; f a -&gt; f b<br>
<br>
When I tried to encode this function as f (a =&gt;b) -&gt; f (a) =&gt; f (b), I<br>
got typecheck error and it is understandable. A somehow worked (sorry,<br>
no code, I&#39;m rewriting it from scratch) is encoding Combinative, that<br>
will be triple of endofunctor f, two endobifunctors &#39;ext&#39; and &#39;int&#39; and<br>
group of morphisms \all {a b} -&gt; ext (f a) (f b) =&gt; f (int a b) . This<br>
should typecheck, however, such interface looks extremly heavyweight<br>
from perspective of size of declarations. So, what extension of<br>
functorOps may codify Applicative in sane way ?<br>
_______________________________________________<br>
Agda mailing list<br>
<a href="mailto:Agda@lists.chalmers.se">Agda@lists.chalmers.se</a><br>
<a href="https://lists.chalmers.se/mailman/listinfo/agda" target="_blank">https://lists.chalmers.se/mailman/listinfo/agda</a><br>
</blockquote></div><br>