2014-12-25 60 views
-1

我正在通過使用ocaml製作一個龜圖形程序。這需要提供符合以下OCaml簽名的模塊的實現。如何使模塊符合OCaml簽名

type program 
type ins 

val mf: float -> ins 
val mb: float -> ins 
val tl: float -> ins 
val tr: float -> ins 
val pu: ins 
val pd: ins 
val repeat: int -> program -> ins 
val make_program: ins list -> program 

type stroke 
val strokes: program -> stroke list 

type state 
val animate: program -> state list 

val strokes': program -> unit 
val animate': program -> unit 
  • 定義類型烏龜程序和龜說明。
  • 用於構建指令和程序的mf,mb,tl,tr,pu,pd,repeat和make_program函數是 。
  • 定義筆畫的類型。
  • 編寫一個函數筆畫,給定一個海龜程序,返回由海龜繪製的筆畫列表 。
  • 定義一個龜的狀態類型。
  • 對一個函數進行編程,給出一個龜的程序,返回該龜的狀態列表 。
  • 筆劃和動畫」渲染招龜動畫

這是我mfpupd代碼:

type turtle = { 
    mutable x : float; 
    mutable y : float; 
    mutable phi : float; 
    mutable stt : int; 
} 

let round = int_of_float 

let pi = 3.1415926535897932384626433832795 

let rad_of_deg a = a *. pi /. 180. 

let p = { x = 100.; y = 100.; phi = 0.; stt = 1 } 

let pu() = 
    p.stt <- 0 

let pd() = 
    p.stt <- 1 

let mf l = 
     let x2 = (p.x) +. l *. cos (rad_of_deg p.phi) 
     and y2 = (p.y) +. l *. sin (rad_of_deg p.phi) in 
     moveto (round p.x) (round p.y); 
     if (p.stt == 1) then lineto (round x2) (round y2); 
     p.x <- x2; 
     p.y <- y2 

mf輸出是: val mf: float -> unit = <fun>

我的問題是如何使它看起來像要求?

+2

問題是? – ivg

+0

如何構建符合上述Ocaml簽名的模塊 – LaD

+4

從我看到您的問題是您的函數'mf'返回'unit'並且您希望它返回'ins'。但是,'ins'是什麼類型?這是一種抽象類型,這意味着您要指定它在實現中的含義,但不能在模塊界面中顯示它。所以,在你提出可以幫助的問題之前,你需要做一些工作。 –

回答

0

我會盡量給你一些提示,但你應該考慮學習OCaml的教科書。我不會在幾個按鍵中教你OCaml,不是因爲我不想,而是因爲它不可能。

在OCaml中編譯單元由兩個部分組成:

  • 模塊實現
  • 模塊簽名

模塊實現由值和類型的,並且每個值有一個類型,相關聯的它。 OCaml會爲您推斷值的類型,但您可以使用類型註釋來幫助它。

該實現應該放在一個擴展名爲.ml的文件中。應將簽名放入一個帶有.mli擴展名的文件中。如果OCaml編譯器共享相同的名稱併爲您建立編譯單元,那麼它們可以將它們同時帶入它們,並可以稍後鏈接到可執行文件中。

例如,您可以將給定的以上簽名放入名爲gr.mli的文件中。然後你需要編寫一個文件來實現這個接口。您必須命名此文件gr.ml並將其類型和值放入其中。然後,你可以使用

ocamlbuild gr.cmo 

和ocaml的編譯器會檢查您的實現是否真正實現了定簽名編譯。爲了符合簽名,你的模塊應該包含簽名中指定的所有值和類型,並且它們的類型應該是相同的。事實上,你的實現可以包含更多的值,並且值的類型可以比簽名中指定的更一般,但是我們將會很遠。

您在示例中顯示的內容(我指的是val mf: float -> unit = <fun>)實際上是OCaml頂層解釋器的輸出。它由三個部分組成(我用大寫字母來表示,這是該模式的可變部分):

val NAME : TYPE = VALUE 

其中NAME是一個值的名稱(在你的情況下,它是mf),TYPE是其推斷類型(您的案例中的float -> unit)和VALUE是該值的可打印表示。由於函數沒有可打印的表示,因此在您的情況下將其標記爲<fun>。您可以將您的定義類型與所需定義的類型(即float -> ins)進行比較。如果類型ins等於unit類型,則猜測這種類型可以相等並不難。這是否屬實取決於您的實施。

我希望,這會幫助你。但這不是閱讀教科書。我只是想給你開始提示。

+0

我必須使用上面的簽名來構建一個龜圖形程序。你可以幫我嗎? – LaD