2011-11-19 23 views
12

Standardowa funkcja biblioteki SML Int.toString przedrostek liczb ujemnych z ~ zamiast -. Czy istnieje funkcja biblioteki korzystać - zamiast krótkiego pismaJak przekonwertować ujemne liczby całkowite na ciągi w SML ze znakiem minus zamiast tyldy?

fun i2s i = 
    if i < 0 then "-"^Int.toString (~i) else Int.toString i 
+0

Zauważ, że twoja funkcja będzie powodować OverflowError w niektórych przypadkach, ponieważ na typowych architekturach najmniej reprezentowalna liczba całkowita ma większą wartość niż najwyższa reprezentowalna liczba całkowita. (Na przykład, 32-bitowe liczby całkowite ze znakiem uzupełnienia dla dwóch uzupełniających się wartości mieszczą się w zakresie od ~ 2147483648 do 2147483647.) To może ale nie musi być akceptowalne dla twojego przypadku użycia. Jeśli * nie jest * dopuszczalne, to jedną z opcji jest 'fun i2s i = String.map (fn #" ~ "=> #" - "| c => c) (Int.toString i)'. – ruakh

Odpowiedz

7

W skrócie, nr

SML jest przeznaczona do użytku ~ dla jednoargumentowy minus, aby uniknąć nieporozumień z - (minus binarnego). Jest to rozsądna decyzja, kiedy każdy operator ma tylko jeden cel, a użytkownicy SML muszą z tym żyć.

Mimo że dziwne jest czytanie reprezentacji łańcuchowej liczby całkowitej zaczynającej się od ~, nie ma funkcji bibliotecznej do przekonwertowania jej na ciąg znaków w normalnej konwencji. BTW, twoja funkcja to dobry sposób na zrobienie tego.