Typ danych Option
jest używany, jeśli istnieje możliwość wystąpienia czegoś niepoprawnego.
Na przykład
fun divide x y = if y == 0 then NONE else SOME (x/y)
mogą być wykorzystane, jeśli trzeba obsłużyć szczególny przypadek dzielenia przez zero, bez uciekania się do wyjątków.
TextIO.inputLine
powraca NONE
gdy nie ma nic więcej do czytania, a SOME l
, gdzie l
jest linia to czytać, gdy nie jest.
before
to funkcja wstawiania o niskim priorytecie (najniższa ze wszystkich), która najpierw ocenia lewą stronę, następnie prawą stronę, a następnie zwraca wartość po lewej stronie.
Ma on typ 'a -> unit -> 'a
, tj. Prawa strona jest używana tylko dla jej efektów ubocznych.
W tym przypadku, to sprawia, że kod nieco bardziej czytelne (i funkcjonalny wyglądzie) niż równowartość
fun readlist (infile : string) =
let
val
ins = TextIO.openIn infile
fun loop indata =
case TextIO.inputLine indata of
SOME line => line :: loop indata
| NONE => []
result = loop ins
in
TextIO.closeIn ins;
result
end
Przy aktualnym poziomie, to lepiej dowiedzieć się SML czytając poradnik. Czytanie programów i pytanie o każde napotkane słowo, którego nie rozumiesz, nie będzie efektywnym wykorzystaniem niczyjego czasu. Wypróbuj http://homepages.inf.ed.ac.uk/stg/NOTES/notes.pdf (pierwszy link podczas wyszukiwania w Google "samouczek SML") –
Powinieneś poszukać typu danych "opcja", aby dowiedzieć się więcej o swoim pytaniu. – joom
@PascalCuoq To, co widzę, to osoba, która przyjrzała się programowi, który robi coś bardzo praktycznego - pobierając dane z pliku - i próbuje zrozumieć, co robi. Niestety * Programowanie w standardzie ML '97: Wprowadzenie do samouczka *, do którego się łączysz zakłada, że czytelnik ma już znajomość struktury 'option', tzn. Pierwsze użycie to *" wyniki z funkcji Bool.fromString są BRAK lub NIEKTÓRE b "* ponieważ samouczek zakłada doświadczenie z C: np "* Znajoma metafora programowania C do przetwarzania plików może być łatwo zaimplementowana w standardowym ML. *" –