2014-01-07 26 views
1

我瞭解到,功能接受任意類型可以創建,像這樣的:OCaml:如何確定函數參數的類型?

let f x = x;; 

let f x =();; 

let f (x : 'a) =();; 

但我不能找到一種方法,利用內部功能類型的信息,就像這樣:

let print_is = function 
    | (x : int) -> print_int x 
    | (s : string) -> print_string s 
    | _ -> print_string "***";; 

是不是真的根本不可能,如果是的話 - 這種限制的基本思想是什麼?或者我只是沒有正確的谷歌?

+0

OCaml的最大優點之一是你不需要明確關心'type'。 –

+0

啊......好吧,但現在我只需要發現如何使用它:D –

+2

如果你想處理一種或另一種類型的值,OCaml可以很好地處理這些值。它被稱爲變體。所以你可以做一些事情,比如'type shoeswear = shoe_size |鞋子Sock'。 –

回答

2

的OCaml不會在運行時保持類型信息:爲了寫你的建議的程序,一個需要相匹配,對類型的x,因此人們會需要一個代表的x在類型的值爲了模式匹配就可以了。

我看到兩個途徑,進一步回答了你的問題:

  • 檢查參數的類型和建設表示上述類型的值是仍在積極調查研究的問題:這是很難以類型安全的方式執行這些操作,而不會中斷抽象。 GrégoireHenry目前正在這樣做,似乎正在分享他的工作https://gitorious.org/ocaml-ty/pages/CurrentTy
  • 如果您正在尋找打印任意值的方法,OCaml中的自然方法是直接使用「右」功能來打印鍵入你想要的,因爲在OCaml中沒有通用打印機。也就是說,還有一些額外的庫,如deriving可以爲您的類型定義生成自動打印機。
+0

> OCaml在運行時不保留類型信息 啊,最後我明白了這句話。那麼這顯然是不可能的,就像在C中一樣。好吧,這不是關鍵問題。 –

+0

「OCaml中沒有通用打印機」那麼,*有*打印功能可以在任何類型的任何值上使用反射。但是,它無法區分在運行時表示相同的不同類型的值。但它仍然相當長,並遞歸地正確輸出複合類型的結構。 – newacct

+0

絕對地,這意味着函數只會看到一個指向標記爲0的塊的指針,並且無法理解這是否意味着「缺陷」的標記,如下所示: ''' type'a list = Nil | 'a *'缺點列表 ''' 或其他類型的其他內容。 –