У меня есть этот код Haskell, который при компиляции с GHC и выполняется, прерывается с обнаруженным циклом.
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 ()
Я думаю, что этого не должно быть, и вот некоторые изменения. Каждый из них заставляет петлю уходить:
- изменить
data Fooнаnewtype Foo - изменить
(noOp <+> someOp)на(someOp <+> noOp) - удалить деконструкцию
@(Foo x)
Является ли это ошибкой в GHC или это мое отсутствие понимания процесса оценки?