Vraag Haskell-programma geeft `<< loop >>` uit


Ik schreef een Haskell-programma dat een binaire zoekopdracht uitvoert op een lijst. Dat dacht ik tenminste. Toen ik het programma compileerde met ghc v7.6.3 en heeft het programma uitgevoerd Ik kreeg de volgende uitvoer:

progname: <<loop>>

Wat betekent deze output in vredesnaam? Betekent dit dat ik een oneindige lus had ghc geoptimaliseerd weg? Hoe moet ik dit debuggen?


24
2018-02-01 23:45


oorsprong


antwoorden:


Zoals verschillende van de opmerkingen hebben gezegd, is dit de Haskell RTS die tijdens runtime een oneindige lus detecteert. Het kan niet altijd detecteer dergelijke lussen, maar in eenvoudige gevallen kan dat.

Bijvoorbeeld,

x = x + 1

compileert prima, maar lokaliseren een uitzondering tijdens runtime. (Overigens is dit een uitzondering - in het bijzonder, kunt u vangst het als je wilt. Maar u "wilt" waarschijnlijk niet.)

Dus waarom laat GHC dit zelfs compileren? Nou ja, want als ik het vervang + met, laten we zeggen, :, dan eindigt de uitdrukking nu prima. (Het vertegenwoordigt een circulaire lijst met één element.) De compiler kan bij het compileren niet vertellen wat wel en niet zinvolle recursie is. De RTS kan niet altijd vertellen tijdens runtime; maar wanneer het kan Vertel dat er iets mis is, laat het je weten door een uitzondering op je af te werpen.


25
2018-02-04 13:52