[nem-pl] polimorficzna rekursja

Michal Moskal malekith at pld-linux.org
Fri Jan 30 20:47:45 CET 2004


On Fri, Jan 30, 2004 at 08:39:26PM +0100, ToMasz Wierzbicki wrote:
> Michal Moskal wrote:
> > 
> > Czy ja dobrze kombinuję, że to jest przykład polimorficznej rekursji?
> > I czy istnieją jakieś sensowne przykłady?
> > 
> > module M {
> >   'a meth (v : int, x : 'a) : 'a {
> >     if (v < 0) x
> >     else {
> >       def (x, _) = meth (v - 1, (x, x));
> >       x
> >     }
> >   }
> > 
> >   Main () : void {
> >     printf ("%d\n", meth (5, 1));
> >   }
> > }
> 
> To NIE jest przykład polimorficznej rekursji. Ta funkcja czasem zwraca
> int, czasem int * int itd, więc nie może mieć typu.

Nie, zwraca zawsze 'a.

> Polimorfizm bierze się z ignorowania danych. Wyniku nie można zignorować.
> 
> Nie możesz dać jej typu int * 'a -> 'a, bo Ci system typów padnie, jak
> spróbujesz napisać M.meth(0,1) == 1

Nie bardzo rozumiem.

-- 
: Michal Moskal :: http://www.kernel.pl/~malekith :: GCS !tv h e>+++ b++
: When in doubt, use brute force. -- Ken Thompson :: UL++++$ C++ E--- a?




More information about the devel-pl mailing list