У меня есть этот код 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 или это мое отсутствие понимания процесса оценки?