2011-05-14 24 views
20

En Haskell, se considera buena práctica declarar explícitamente la firma de tipo de sus funciones, aunque puede (por lo general) deducirse. Parece que esto ni siquiera es posible en OCaml, p.OCaml firmas de tipos explícitas

val add : int -> int -> int ;; 

me da un error. (Aunque puedo hacer type módulos que dan sólo las firmas.)

  1. Estoy en lo cierto que esto no es posible hacerlo en OCaml?
  2. Si es así, ¿por qué? El sistema de tipo de OCaml no parece increíblemente diferente de Haskell.

Respuesta

30

OCaml tiene dos formas de especificar tipos, que pueden hacerse en línea:

let intEq (x : int) (y : int) : bool = ... 

o pueden ser colocados en un archivo de interfaz, como lo han hecho:

val intEq : int -> int -> bool 

I cree que este último es el preferido, ya que separa más limpiamente la especificación (tipo) de la implementación (código).


Referencias: OCaml for Haskellers

+0

Esta última opción ya no es una opción válida. Al menos OCaml 4.04.0 no lo admite. Todos deberían usar la primera opción. –

11

Im general, la sintaxis para let -bind un valor con un tipo restringido es:

let val : constraint = e ... 

aplica a una función, puede especificar la firma de la siguiente manera:

let add : int -> int -> int = fun x y -> ... 

Esto es análogo a la sintaxis necesaria para limitar un módulo para una firma:

module Mod 
    : sig ... end 
    = struct ... end