Je ne sais pas quelle exception il faudrait utiliser. En Caml, assert fait appel à Assert_failure. Ça a été renommé AssertionFailure dans F#, mais ce n'est pas très pratique à utiliser soi-même.
À la limite, "exception InternalError" n'est pas très long à taper.
Envoyé par
bluestorm
Mais du coup, c'est quoi son type ? Ils l'ont vraiment mise en ('a -> 'a) ?
Non, pas tout à fait. C'est le même principe que pour les opérateurs (+), (*), etc. Son vrai type est :
val truncate : ( ^a -> ^a) when ^a : (static member Truncate : ^a -> ^a)
Mais le compilateur doit pouvoir résoudre le type concret statiquement. Pour résoudre, il regarde comment la fonction est utilisée ; si l'argument n'est pas connu, il utilise le contexte (plus loin dans le fichier) ; dans le pire des cas, il utilise le type par défaut (ici, float). Quelques exemples pour que ce soit plus clair :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
> truncate 3.2M;;
val it : System.Decimal = 3M
> truncate;;
val it : (float -> float) = <fun:clo@42>
> let foo x = truncate x
let a = foo 3.2f;;
val foo : float32 -> float32
val a : float32
> let bar x = truncate x
let b = bar 3.2M;;
val bar : System.Decimal -> System.Decimal
val b : System.Decimal
> truncate<float32>;;
val it : (float32 -> float32) = <fun:clo@43>
> let f x : decimal = truncate x;;
val f : decimal -> decimal |
Partager