我正在嘗試創建一個函子,它使一個多項式環出環。我的基本類型,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'(這些都在你的第二個例子中都被修正了)。 – Lhooq
謝謝。對於與其他語法錯誤一起快速而寬鬆地抱歉。 –
看起來,調用'match List.rev lst with ... :: tl - > ... List.rev tl'是獲取列表最後一個元素的低效方法(因爲您幾乎要重建整個列表兩次)。相反,做一個函數'last:'列表 - >'一個選項'。爲了消除前導零(就像列表中的第一個零),你可能會喜歡一個函數'dropWhile:('a - > bool) - >'列表 - >'列表' https://hackage.haskell.org/package/base-4.8.2.0/docs/Data-List.html#v:dropWhile)。 –