Ho questo codice Haskell che, una volta compilato con GHC ed eseguito, si interrompe con un loop rilevato.Il programma Haskell si interrompe con "loop" ma penso che non dovrebbe essere
data Foo = Foo()
deriving (Eq,Show)
type Foop = Foo -> ((),Foo)
noOp :: Foop
noOp st = ((),st)
someOp :: Foop
someOp [email protected](Foo x) = ((),st)
(<+>) :: Foop -> Foop -> Foop
(<+>) f g st = let ((_,st'),(_,st'')) = ((f st),(g st')) in ((),st'')
main = print $ (noOp <+> someOp) $ Foo()
Penso che non dovrebbe, e qui ci sono alcune modifiche. Ognuno di loro fa il loop va via:
- cambiamento
data Foo
-newtype Foo
- cambiamento
(noOp <+> someOp)
a(someOp <+> noOp)
- rimuovere la decostruzione
@(Foo x)
Si tratta di un bug in GHC o è la mia mancanza di comprendere il processo di valutazione?
È sufficiente utilizzare una corrispondenza irrefutabile: 'let ((_, st '), ~ (_, st' ')) = (f st, g st')'. – leftaroundabout
@leftaroundabout Non è 'st''' la prima cosa che viene richiesta? 'lascia ... in ((), st '')'. Inoltre, 'g' potrebbe non essere severo nel caso generale. – chi
Grazie, è stato perspicace. Ora nel mio codice non c'è 'indefinito' e non vedo ancora il motivo per cui si ripete. Potresti anche far luce su questo? –