2011-12-28 19 views

Odpowiedz

21

Co się dzieje, że te funkcje nie mogą zostać zaimplementowane w Haskell, ale powinny pojawić się w dokumentach. Ponieważ haddock potrzebuje poprawnej składniowo (i dobrze napisanej) definicji dla każdego podpisu, źródło musi zawierać fałszywe definicje. Ponadto, w punkcie, w którym są zdefiniowane (w pakiecie ghc-prim), error (i tym samym undefined) nie są jeszcze dostępne, więc nie można użyć bardziej oczywistego seq = error "Not implementable in Haskell", a więc definicji kołowej.

+1

Czy istnieje przyczyna "błąd" * nie można * zdefiniować wcześniej niż 'seq' i przyjaciele? –

+3

'błąd' jest zdefiniowany jako' throw (komunikat ErrorCall) ', dlatego potrzebny jest mechanizm' Exception' i 'Typeable'. Można go zdefiniować poza strukturą wyjątku '' '', bezpośrednio z wykorzystaniem prymitywu 'raise #', o ile wiem, ale ładniej jest dopasować go do innych 'wyjątków'. Tak więc, aby zachować małe 'ghc-prim', które zapewnia tylko' raise # ', bardziej skomplikowane rzeczy trafiają do 'base'. W skrócie, można go zdefiniować wcześniej, ale nie jest tak przyjemny i nie ma powodu, aby to robić, a źródłem 'GHC.Prim' byłoby i tak nieużywany manekin. –

9

Te definicje są podstępem: są dostarczane pierwotnie przez środowisko wykonawcze GHC. Okazuje się, że nieskończoną pętlę let x = x in x można nadać dowolnemu typowi, więc jest to równie dobra definicja podstępu jak każda inna.