2009-03-20 28 views
7

ho bisogno di una funzione valore assoluto per i galleggianti in OCaml e il linguaggio di base non sembra possedere uno, così mi ha scritto quanto segue:Valore assoluto per i galleggianti a nucleo OCaml

let absF (f:float) = if f > 0.0 then f else (f *. -1.0);; 

che sembra a lavorare per i positivi, ma non per i negativi, citando:

Questa espressione è di tipo float -> float, ma è qui utilizzato con tipo int

Qual è l'errore nella mia logica?

risposta

10

Quando si digita

absF -1.0;; 

OCaml interpreta come

(absF) - (1.0);; 

vale a dire come una sottrazione. Invece, fare

absF (-1.0);; 
13

Il linguaggio principale ne ha uno, abs_float.

Inoltre, è possibile utilizzare ~-. per indicare la negazione unaria e ciò vale anche per gli interi con l'operatore ~-. È possibile definire un tale operatore (anche se esiste già) in questo modo:

let (~-) a : int = 0 - a 
let (~-.) a : float = 0.0 -. a 
2

se avete valore int può utilizzare

# abs(-1) 
- : int = 1 

altrimenti se si dispone di un galleggiante

# abs_float(-1.0) 
- : float = 1.