多項式リングをリングから外すファンクタを作成しようとしています。私の基本的なタイプ、Ring_eltは、次のシグネチャがあります。私の多項式ファンクタがどのように見えるファンクタのOCaml構文エラー
module type Ring_elt = sig
type t
val add : t -> t -> t
val mul : t -> t -> t
val zer : t
val one : t
val neg : t -> t
end;;
:
module Make_Poly2(Underlying:Ring_elt) = struct
type t = Poly of Underlying.t list
let rec create lst =
match List.rev lst with
| Underlying.zer :: tl -> create List.rev tl
| _ -> Poly of lst
end;;
(そう「作成」機能は、その後、リストを取る先頭のゼロを削除し、必要があります結果の多項式を返します)。しかし、私は構文エラーを取得し、utopは "基礎"の後ろに "zer"を強調します。
は比較すると、(整数の多項式を作るための)次のコードは動作します:
module Make_int_poly = struct
type t = Poly of int list
let rec create lst =
match List.rev lst with
| 0 :: tl -> create (List.rev tl)
| _ -> Poly lst
end;;
何が起こっているすべてのアイデア?
構文エラー 'Poly of lst'とタイプエラー' create List.rev tl'(2つ目の例では両方とも修正されています)を編集する必要があります。 – Lhooq
ありがとうございます。他の構文エラーと速くてゆるいことを謝罪します。 –
'List.rev lst with ... :: tl - > ... List.rev tl'は、リストの最後の要素を取得するのに非効率的な方法です(リスト全体を再構築しているので2回)。むしろ、関数last:リスト - >オプションaを作成します。先行ゼロを削除するには(リストの最初の0のように)、関数 'dropWhile:( 'a - > bool) - >'リスト - > 'リスト'を[これとは異なりません] https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-List.html#v:dropWhile)。 –