2017-05-13 17 views
0

私はOCamlを段階的に学習しています。最近、OCamlの "モジュールラングゲージ"という素晴らしい世界に出会ったことがあります。ここでモジュール内での関数の宣言OCaml

私の問題である:

module type TEST = sig 
    val addend : 'a -> list 
end 

module Test : TEST = 
    struct 
     let addend (val,lol) = 
     val::lol 
    end 

私はそれが私がsyntax errorを持っていることを私に伝え通訳の内部でこれを使用しようとすると... 私はそれがだ、この男に頼まanoying質問のこの種のことを知っていますnoobとスタックオーバーフローがここに書き直すには最適化されていないコードだと思っていますが、時間がたっても私はこの時点でほとんど覚えていた解決策を探しています...

OCamlはクールですが、 。

+0

OCamlのような静的型付けされた言語は、Clojureのような動的型付き言語よりも最初は難しいと思いますが、静的型付けには利点があります。どのように多くの型アノテーションをJavaで正確に指定する必要があるか考えてみると、OCamlは非常に簡単に見えます。おそらく、OCamlのモジュール言語は最も難しい部分ですが、あなたはそれを使わなければ多くのことを行うことができます。 – Mars

答えて

1

まず、モジュールのタイプの定義では、リストの要素のタイプを指定する必要があります。 listだけを使用することはできません。

module type TEST = sig 
    val addend : 'a -> 'a list 
end;; 

をしかし、あなたは後で要素、リストを取り、このリストには、この要素を置く関数を定義したいとあなたがやりたいことはありません。

次のコードはコンパイルされます。 だから、このような関数のシグネチャは、次のとおりです。

'a -> 'a list -> 'a list 

だからあなたのモジュールのタイプは、しなければならない:

module type TEST = sig 
    val addend : 'a -> 'a list -> 'a list 
end;; 

と実装:

module Test : TEST = 
struct 
    let addend a l = a::l 
end 
;; 

、あなたのコードにご注意くださいあなたはカッコで引数を渡すCのような言語の影響を受けるかもしれません。 Ocamlでは、タプルにカッコが使用されています。これは、実装がシグネチャと異なることを意味します。

+0

ありがとうございました。私のコードを書いているときにもっと集中する必要があるようです...署名のおかげで、私はあなたのリストを未定義のリストタイプとして定義する必要があるか分からなかった... – xoxel

+3

Pierre Gそれは言及していませんでしたが、私はあなたのコードであるxoxelの別の問題は、特別なキーワードであるため、変数名として 'val'を使うことができないと思います。 (私は初心者ですが、これは正しいと思います。) – Mars

1

valがキーワードであるため、構文エラーが発生します。これを識別子として使用することはできません。