2014-07-27 15 views
5

Jestem nowy dla sml (i programowania, faktycznie).Jakie są opcje Niektóre i Brak SML?

fun readlist (infile : string) = 

    let 
    val 
     ins = TextIO.openIn infile 

     fun loop ins = 

     case TextIO.inputLine ins of 

     SOME line => line :: loop ins 

    | NONE  => [] 

    in 

    loop ins before TextIO.closeIn ins 

    end ; 

To program, który tu spotkałem. Jak korzystać z niektórych i braków. A jak używać "przed"?

+4

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") –

+0

Powinieneś poszukać typu danych "opcja", aby dowiedzieć się więcej o swoim pytaniu. – joom

+2

@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. *" –

Odpowiedz

6

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 
4

Some('a) i None są częścią typu danych Option. Option jest algebraiczną lub złożoną strukturą danych znalezioną w SML's Basis Library. Więcej informacji na temat typu danych opcji na Wikipedia. Ideą jest, aby funkcja zwróciła wartość None, gdy nie ma sensu, aby funkcja zwróciła wartość typu, którego programista naprawdę się interesuje.

W przypadku zdefiniowanej przez użytkownika funkcji readlist ważnymi danymi są ciągi. Ale w pewnym momencie program trafi na koniec pliku i odczytuje wartość interpretowaną jako EOF zamiast ciągu.

Pomyśl o TextIO.openIn jako funkcji, która otwiera strumień i wyszukuje go dla ciągów. Za każdym razem, gdy znajdzie ciąg, zwraca on option(string). Gdy nie znajdzie ciągu, zwróci None. Ponieważ oba są częścią typu danych Option(string), zwraca tylko jeden typ.

Strumień linii wejściowej strumienia] zwraca KATALOG (ln), gdzie ln jest kolejnym wierszem wejścia w strumieniu strumienia. W szczególności ln zwraca wszystkie znaki z aktualnej pozycji do następnego znaku nowego wiersza (# "\ n"). Jeśli to wykryje koniec strumienia przed następnym znakiem nowego wiersza, zwraca on znak dołączony do znaków nowej linii. Tak więc, ln jest gwarantowane zawsze być zakończone nową linią (a zatem niepustą). Jeśli obecna pozycja strumienia jest końcem strumienia, to zwraca NONE. Podnosi rozmiar, jeśli długość linii przekracza długość najdłuższego łańcucha .

Związana koncepcja w SML to user-defined datatypes. Zarówno struktura danych, jak i typy danych zdefiniowane przez użytkownika zapewniają elastyczność w statycznym systemie SML w nieco podobny sposób do sposobu, w jaki obiekty są używane w statycznie typowanych językach obiektowych.

Powiązane problemy