2017-03-05 74 views
16

Dlaczego funkcja read kończy działanie pliku wykonywalnego, gdy nie można przeanalizować jego argumentu?Czy istnieje całkowita alternatywa dla funkcji `czytaj`?

Wydaje mi się, że byłoby wygodniej mieć funkcję typu String -> Maybe a, która zwraca Nothing jeśli łańcuch nie może być analizowany z typem a, ale nie mogę znaleźć czegoś podobnego. czego mi brakuje?

+0

Nie znam zbyt wiele Haskella, ale nie rozumiem, jak funkcja "czytaj" może być czysta: z definicji ma * znaczące * skutki uboczne. –

+10

@BasileStarynkevitch 'read' nie czyta z wejścia; po prostu konwertuje swój argument na 'String' (podobnie jak metoda Python' __str__'). – chepner

+0

Jest to jedna z kilku funkcji w Prelude (w tym 'head' i' tail'), które mogły zostać wykonane w całości, ale zostały zdefiniowane jako częściowe funkcje dla uproszczenia. – chepner

Odpowiedz

23

Funkcja szukasz nazywa readMaybe i jest zdefiniowany w module Text.Read:

https://hackage.haskell.org/package/base-4.9.1.0/docs/Text-Read.html#v:readMaybe

Jest dostępny od GHC 7.6. Wcześniej trzeba było zadzwonić pod numer reads, który zwraca (potencjalnie pustą) listę przeanalizowanych wartości i dopasowanie do wzorca.

+1

Dodawanie 'readMaybe' do Prelude [cam up ostatnio na liście mailingowej bibliotek] (https://mail.haskell.org/pipermail/libraries/2016-December/027496.html). – Alec