簡體   English   中英

OCaml模塊和簽名

[英]OCaml modules and signatures

在我的練習中,鑒於其簽名,我必須編寫OCaml模塊:

module type Range
 = sig
   type t
   val range : int * int -> t
   (*val list_of_range : t -> int list*)
 end

到目前為止,我擁有的模塊:

module Range = 
  struct
  type t = int
  let range (n,m) = 
    if m > n then () else (n,m)
  end

范圍(n,m)的任務是取2個整數,如果n <= m,則給出一個元組(n,m)。 除此以外 ()。 如果我嘗試運行此代碼, 則會收到錯誤消息, 該表達式具有'a *'b,但是期望使用類型為unit的表達式 任何人都可以幫助我前進嗎?

PS。 這是我與OCaml合作的第一天。

PPS。 我已注釋掉范圍列表..部分,因為這是練習的第二部分,如果第一部分不起作用,它將無法正常工作。

UPDATE

我已經更新了代碼,結果似乎很有希望。

module type Range
 = sig
   type t
   val range : int * int -> t
   val list_of_range : t -> int list
 end

module Range = 
  struct
  type t = int

  let range (m,n) = 
    if m > n then (0,0) else (m,n)      

  let rec list_of_range (m,n) = 
    let t = range(m,n) in 
    let x = fst(t) in let y = snd(t) in
    if x = 0 && y = 0 then [0] else x :: list_of_range(x+1,y)
  end

上面的代碼給了我幾乎完美的預期結果。 如果輸入(1,5),則結果為[1; 2; 3; 4; 5; 0]。 問題是0作為列表中的最后一個元素。 為什么在那里? 它從何而來?

問題出在您的函數范圍內,它無法返回單元類型(即())和元組。 此外,它違反了簽名,在簽名中您將range定義為返回int的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM