2015-03-05 22 views
11

Pisałem szybko jakiś kod w Haskell i użyłem niebezpiecznej funkcji nie sumarycznej, a mianowicie fromJust (gdzie spodziewam się wartości z wejścia). Zastanowię się później, jakiego rodzaju stylu obsługi błędów chcę użyć.Czy GHC może ostrzec o wykorzystaniu niebezpiecznych funkcji nie sumujących się?

Czy GHC pomoże mi upewnić się, że pozbyłem się wszystkich niebezpiecznych funkcji nie sumujących się (takich jak fromJust lub head, które mogą ulec awarii), daj mi ostrzeżenia, gdzie one są.

+2

Wnioskowanie cząstkowe jest obecnie przedmiotem dyskusji przez twórców GHC. W międzyczasie najlepiej jest ukryć import tych funkcji i (aby się upewnić, że są naprawdę ukryte) przedefiniuj je samemu: 'fromJust =()' powinno wystarczyć. – dfeuer

+3

Nawet po prostu zredefiniuj je w module, który importujesz bez zastrzeżeń jako "włączanie ostrzeżenia". Otrzymasz błąd niejednoznaczności wskazujący na miejsca, w których faktycznie używasz wersji Prelude (chyba, że ​​się do tego zakwalifikujesz, jak w 'Prelude.fromJust'). Nie pomoże to jednak częściowym funkcjom, których używasz z kwalifikowanych importów innych modułów. – Ben

Odpowiedz

3

GHC może ostrzegać o definicjach z częściowymi wzorami z -fwarn-incomplete-patterns (jednak nie ostrzega o użyciu wartości zawierających niekompletne wzory). Dodatkowo, catch Neila Mitchella podejmuje nieco bardziej szczegółową analizę, aby zidentyfikować bezpieczne i niebezpieczne inwokacje funkcji częściowych. (Chociaż oczywiście jest to ogólnie nierozstrzygalny problem, więc nie zawsze będzie to właściwe!)

+0

Po prostu uwaga dla mnie. Doszedłem do wniosku, że kiedykolwiek chcę użyć dopasowania niezgodnego ze wzorcem w praktycznie użytecznym kodzie (i uważam, że semantycznie wyczerpuję wszystkie prawdziwe przypadki), nie powinienem. W niektórych przypadkach powinno być co najmniej możliwe, aby założenie było bardziej wyraźne poprzez zawijanie funkcji niepełnej w klasie i zdefiniowanie jej w pobliżu miejsca, gdzie jest oczywiste, że jest w porządku (jako obejście całkowicie niebezpiecznego i niekontrolowanego kodu). Przykład: [ograniczenie 'ToJSONObject'] (https://github.com/bos/aeson/issues/79#issuecomment-108959252) dla danych ogólnie zakodowanych i zdekonstruowanych. –