Ostatnio czytałem o unsafePerformIO
i chciałbym Cię o coś zapytać. Nie przeszkadza mi fakt, że prawdziwy język powinien być w stanie wchodzić w interakcje ze środowiskiem zewnętrznym, więc unsafePerformIO
jest w pewnym stopniu uzasadnione. Jednak, o ile mi wiadomo, nie zdaję sobie sprawy z szybkiej metody sprawdzenia, czy interfejs/biblioteka pozornie czysta (sądząc po typach) jest naprawdę czysta bez sprawdzania kodu w poszukiwaniu połączeń pod numerem unsafePerformIO
(dokumentacja mogłaby nie wspomnieć o tym). Wiem, że powinien on być używany tylko wtedy, gdy masz pewność, że gwarancja referencyjna jest gwarantowana, ale mimo to chciałbym o tym wiedzieć.Jak sprawdzić, czy pozornie czysty interfejs Haskell ukrywa niebezpieczne operacje?
Odpowiedz
Nie ma mowy bez sprawdzenia kodu źródłowego. Nie jest to jednak zbyt trudne, ponieważ Haddock podaje ładny link bezpośrednio do definicji podświetlonych w skrypcie. Zobacz przykładowe linki "Źródło" po prawej stronie definicji na stronie this page.
Safe Haskell dotyczy tutaj; służy do kompilowania kodu Haskella w sytuacjach, w których chcesz zabronić używania niebezpiecznej funkcjonalności. Jeśli moduł używa modułu niebezpiecznego (takiego jak System.IO.Unsafe
) i nie jest oznaczony jako Trustworthy
, odziedziczy on swój niebezpieczny status. Jednak moduły korzystające z unsafePerformIO
generalnie będą go bezpiecznie używać, a tym samym deklarują się jako Trustworthy
.
Dziękuję, więc jest tak, jak myślałem ... kod źródłowy lub nic. Cóż, przynajmniej, choć gwarantowane ponownie przez programistę, Safe Haskell może pomóc w automatycznej identyfikacji niektórych niebezpiecznych modułów. –
W przypadku, gdy myślisz, użycie unsafePerformIO
jest nieuzasadnione. Przetłumaczono to na documentation for unsafePerformIO
: dotyczy to tylko przypadków, w których implementujący może udowodnić, że nie ma możliwości złamania przejrzystości referencyjnej, tj. "Czysto funkcjonalnej" semantyki. Oznacza to, że jeśli ktokolwiek używa unsafePerformIO
w taki sposób, że program czysto funkcjonalny może go wykryć (np. Napisać funkcję, której wynik zależy nie tylko od jej argumentów), to jest to niedozwolone użycie.
Jeśli wpadłeś na taki przypadek, najbardziej prawdopodobną możliwością jest znalezienie błędu.
Na pytanie: "Wiem, że powinno to być używane tylko wtedy, gdy masz pewność, że gwarancja referencyjna jest gwarantowana, ale mimo to chciałbym o tym wiedzieć". – ehird
@sakundium: Masz rację, już widziałem stronę z dokumentacją dla 'unsafePerformIO', ale to tylko zasada i nie mogę być pewna, że programista faktycznie ma dowód na referencyjną przezroczystość :) –
- 1. Jak sprawdzić oczekujące operacje w transakcji PostgreSQL
- 2. Dlaczego szablon Haskell zezwala na dowolne operacje IO podczas kompilacji?
- 3. Jak sprawdzić, czy zmienna implementuje interfejs w clojure?
- 4. Jak sprawdzić, czy obiekt z interfejsem implementuje inny interfejs?
- 5. Jak sprawdzić, czy interfejs rozszerza inny w C#?
- 6. Jak sprawdzić, czy liczba zmiennoprzecinkowa jest liczbą całkowitą w haskell?
- 7. Interfejs API Instagram: czy mogę sprawdzić, czy użytkownik jest zweryfikowany?
- 8. RSpec: jak sprawdzić operacje na plikach i złożyć zawartości
- 9. Czy Haskell ma foldlM?
- 10. Haskell niejasne operacje ścieżka pliku (uproszczenia dala kropki)
- 11. Czysty klient HTML WebDAV
- 12. Czy Jedis obsługuje operacje asynchroniczne
- 13. Czy należy zagnieżdżać oczekiwane operacje?
- 14. Sprawdź, czy obiekt implementuje interfejs
- 15. Jakie operacje są operacje atomowe
- 16. Jak sprawdzić, czy uchwyt pliku jest gniazdem?
- 17. Jak zorganizować interfejs użytkownika JavaScript?
- 18. Jak sprawdzić, czy obiekt jest proxy?
- 19. niebezpieczne stwierdzenie wskaźnik ciąg
- 20. Jak naprawić pozornie uszkodzoną kompilację CMake?
- 21. Biblioteka Haskell jak SymPy?
- 22. Sprawdź, czy typ to interfejs
- 23. niebezpieczne konstruktor szablon tablica
- 24. Czy istnieje przenośny odpowiednik __attribute__ (czysty) gcc?
- 25. C++ niebezpieczne obejście obsada
- 26. Jak sprawdzić, czy Java Future jest kompletna?
- 27. Bitowe operacje w OCaml
- 28. Czy niestandardowe atrybuty dla materiałów niebezpiecznych są niebezpieczne?
- 29. Niebezpieczne połączenie w kanciastym
- 30. Kolejność UITableView ukrywa tło
"Wiem, że powinno to być używane tylko wtedy, gdy masz pewność, że gwarancja referencyjna jest gwarantowana" dokładnie. W powinno być używane tylko wtedy, gdy operacje wewnętrzne nie mogą przeciekać na zewnątrz w jakikolwiek rozsądny sposób, tj. Gdy nie ma możliwości stwierdzenia, że takie rzeczy występują pod maską. – leftaroundabout
Nawiasem mówiąc, używanie 'unsafePerformIO' do interakcji ze środowiskiem zewnętrznym jest dokładnie tym, czego nie wolno robić *. Wszystkie efekty powinny być wewnętrzne dla twojego kodu - takie rzeczy jak używanie zmiennej zmiennej za kulisami do implementacji memoizacji. – ehird
@ehird: Dzięki za dalsze wyjaśnienie, ale kiedy napisałem "environment", miałem na myśli to w szerszym możliwym znaczeniu, które obejmuje również biblioteki zewnętrzne (nie-haskell). Nie myślałem o interakcji użytkownika. –