Mam ten kod Haskella, który po skompilowaniu z GHC i uruchomi, przerwie z wykrytą pętlą.Program Haskell przerywa z "pętlą", ale myślę, że nie powinien
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()
Myślę, że nie powinno, a tutaj są pewne modyfikacje. Każdy z nich sprawia, że pętla odejść:
- zmiana
data Foo
donewtype Foo
- zmiana
(noOp <+> someOp)
do(someOp <+> noOp)
- usunąć dekonstrukcja
@(Foo x)
Jest to błąd w GHC czy jest to mój brak zrozumienia procesu oceny?
Wystarczy użyć jednego niezastąpionego odpowiednika: 'let ((_, st '), ~ (_, st' ')) = (f st, g st')'. – leftaroundabout
@leftaroundabout Czy nie jest "pierwszą", która jest wymagana? 'let ... in ((), st '')'. Ponadto, w ogólnym przypadku 'g' może nie być restrykcyjne. – chi
Dzięki, to było wnikliwe. Teraz w moim kodzie nie ma 'undefined' i nadal nie rozumiem, dlaczego to się pętli. Czy możesz rzucić trochę światła na to? –