web-dev-qa-db-ja.com

OCamlの明示的な型シグネチャ

Haskellでは、(通常は)推測できる場合でも、関数の型シグネチャを明示的に宣言することをお勧めします。これはOCamlでは不可能だと思われます。

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

エラーが出ます。 (ただし、署名のみを提供するtypeモジュールを作成できます。)

  1. これはOCamlでは実行できないという点で正しいですか?
  2. もしそうなら、なぜですか? OCamlの型システムは、Haskellとそれほど異なるようには見えません。
31
Xodarap

OCamlにはタイプを指定する2つの方法があり、インラインで実行できます。

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

または、あなたがしたように、それらはインターフェースファイルに置くことができます:

val intEq : int -> int -> bool

仕様(タイプ)を実装(コード)からより明確に分離するため、後者の方が好ましいと思います。


参照HaskellersのOCaml

46
Don Stewart

一般的に、制約された型の値をlet- bindする構文は次のとおりです。

let val : constraint = e ...

関数に適用すると、次のように署名を指定できます。

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

これは、モジュールを署名に制約するために必要な構文に似ています。

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