OCaml firmas de tipo explícitas


En Haskell, se considera una buena práctica declarar explícitamente la firma de tipo de sus funciones, aunque (generalmente) se pueda inferir. Parece que esto ni siquiera es posible en OCaml, por ejemplo,

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

Me da un error. (Aunque puedo hacer type módulos que dan solo firmas.)

  1. ¿Estoy en lo cierto en que esto no es posible hacer en OCaml?
  2. Si es así, ¿por qué? El sistema de tipos de OCaml no parece tan increíblemente diferente de Haskell.
Author: Don Stewart, 2011-05-15

2 answers

OCaml tiene dos formas de especificar los tipos, que se pueden hacer en línea:

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

O se pueden colocar en un archivo de interfaz, como usted ha hecho:

val intEq : int -> int -> bool

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


Referencias: OCaml para Haskelers

 35
Author: Don Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-14 22:52:06

En general, la sintaxis para let-enlazar un valor con un tipo restringido es:

let val : constraint = e ...

Aplicado 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 requerida para restringir un módulo a una firma:

module Mod
  : sig    ... end
  = struct ... end
 13
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-15 14:01:29