Czy istnieje dobry powód, dla którego jest to typ Prelude.read
read :: Read a => String -> a
zamiast zwracać Maybe
wartość?
read :: Read a => String -> Maybe a
Skoro łańcuch Haskell może nie dać się przeanalizować, czy to drugie nie byłoby bardziej naturalne?
Lub nawet Either String a
, gdzie Left
zawierałby oryginalny ciąg, gdyby nie został przeanalizowany, a Right
wynik, gdyby tak się stało?
Edytować:
Nie próbuję nakłonić innych do napisania dla mnie odpowiedniego opakowania. Po prostu szukam pewności, że można to bezpiecznie zrobić.
take
akceptuje żadnegoNum a => a
? Dlaczego istnieje specjalny przypadekfmap
dla list? DlaczegoFunctor
nie jest to wymagane wMonad
przypadku instancji? Oczekuję, że odpowiedź będzie podobna do odpowiedzi na te i pokrewne pytania.readMaybe
wkrótce zostanie dodana funkcja.take
byćIntegral n => n -> [a] -> [a]
?Integral
, a nieNum
- pierdnięcie mózgiem.Odpowiedzi:
Edycja : Od wersji GHC 7.6,
readMaybe
jest dostępna wText.Read
module w pakiecie podstawowym, wraz zreadEither
: http://hackage.haskell.org/packages/archive/base/latest/doc/html/Text-Read.html#v: przeczytajMożeŚwietne pytanie! Sam rodzaj odczytu nie zmieni się w najbliższym czasie, ponieważ to zepsułoby wiele rzeczy. Jednak nie powinno być
maybeRead
funkcja.Dlaczego nie ma? Odpowiedź brzmi „bezwładność”. W 2008 roku odbyła się dyskusja, która została zakłócona przez dyskusję na temat „porażki”.
Dobra wiadomość jest taka, że ludzie byli wystarczająco przekonani, aby zacząć unikać porażek w bibliotekach. Zła wiadomość jest taka, że propozycja zaginęła w tasowaniu. Nie powinna być taka funkcja, choć jeden jest łatwo napisać (i istnieją setki tego bardzo podobnych wersjach pływających wokół wiele codebases).
Zobacz także tę dyskusję .
Osobiście korzystam z wersji z bezpiecznego pakietu .
źródło
Tak, przydałaby się funkcja odczytu, która zwraca wartość Maybe. Możesz zrobić to sam:
źródło
Read a
typeklasy:readMaybe :: Read a => String -> Maybe a
Oprócz inercji i / lub zmieniających się spostrzeżeń, innym powodem może być to, że estetycznie przyjemne jest posiadanie funkcji, która może działać jako coś w rodzaju odwrotności
show
. Oznacza to, że chcesz, abyread . show
była to tożsamość (dla typów, które są wystąpieniemShow
iRead
) i toshow . read
jest tożsamość w zakresieshow
(tj.show . read . show == show
)Posiadanie
Maybe
w typieread
łamie symetrię zshow :: a -> String
.źródło
newtype ValidShow a = ValidShow String
. Typ fantomowy czyni go bardziej bezpiecznym.showThing :: Show a => a -> ValidShow a
ireadThing :: Read a => ValidShow a -> a
, aby typ rzeczy, który został pokazany, został zapamiętany w obiekcie ValidShow. W ten sposób nie możesz pisaćreadThing (showThing True) :: String
.Jak zauważył @augustss, możesz stworzyć własną funkcję bezpiecznego odczytu. Jednak jego
readMaybe
nie jest całkowicie spójny z odczytem, ponieważ nie ignoruje białych znaków na końcu ciągu. (Raz popełniłem ten błąd, nie całkiem pamiętam kontekstu)Patrząc na definicję read w raporcie Haskell 98 , możemy ją zmodyfikować tak, aby zaimplementować w
readMaybe
pełni spójnąread
, a nie jest to zbyt uciążliwe, ponieważ wszystkie funkcje, od których zależy, są zdefiniowane w Prelude:źródło
safe
pakietu, otrzymasz poprawną wersjęreadMaybe
dostępnej (nazywa sięreadMay
i jest identyczna z tą wersją.Ta funkcja (nazywana
readMaybe
) jest teraz w preludium Haskella! (W obecnej bazie - 4,6)źródło