2009-03-20 9 views
7

Ich bin in der Notwendigkeit einer Absolutwertfunktion für Schwimmer in OCaml und der Kernsprache scheint nicht eine zu besitzen, so schrieb ich folgendes:Absolutwert für Schwimmer in Kern OCaml

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

die scheint für positive Ergebnisse zu arbeiten, aber nicht für Negativ unter Berufung auf:

hat Dieser Ausdruck float Typen -> Schwimmer, aber hier wird mit dem Typ int verwendet

Was ist der Fehler in meiner Logik?

Antwort

10

Wenn Sie

absF -1.0;; 

Typ interpretiert OCaml es als

(absF) - (1.0);; 

das heißt als eine Subtraktion. Stattdessen

absF (-1.0);; 
13

Die Kernsprache hat eine, abs_float.

Sie können auch ~-. verwenden, um eine unäre Negation zu kennzeichnen, und dies gilt für Ganzzahlen ebenso wie für den Operator ~-. Sie können einen solchen Operator definieren (auch wenn es bereits vorhanden ist) wie folgt aus:

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

, wenn Sie int Wert haben

# abs(-1) 
- : int = 1 

sonst, wenn Sie einen Schwimmer haben

# abs_float(-1.0) 
- : float = 1. 
verwenden können