2015-04-01 87 views
1

我一直在努力嘗試理解這一點,如果努力工作就會傷害我與OCaml的關係,所以我想我會尋求幫助。不理解Ocaml類型簽名

我從this site

let line_stream_of_channel channel = 
Stream.from 
    (fun _ -> 
    try Some (input_line channel) with End_of_file -> None);; 

好冷靜的簡單功能,清楚它下面的簽名:

val line_stream_of_channel : in_channel -> string Stream.t = <fun> 

in_channel是參數和Stream.t是返回值。

現在爲什麼是OCaml中,我不能做:

Stream string 

,而是我必須做

string Stream.t 

看着the type signature of Stream並沒有真正得到我到任何地方無論是。你必須做不自然的

string list 

而非自然

list string 

但是,什麼是特別奇怪的是的「.T」部分我注意到有類似列表的東西這個相同的語法怪事上面的Stream類型。

任何人都可以解釋這裏發生了什麼,爲什麼事情是這樣做的?我已經在OCaml上使用了關於顯式類型簽名,類型等的教程,並且通常他們會回到這裏來回答非常具體的問題,這些問題對我沒有任何幫助。

謝謝!

回答

1

在OCaml的參數化類型中,類型構造函數名稱出現在參數名稱之後。這只是它的工作方式。有些語言(如Haskell)使用其他順序。

我喜歡OCaml命令,我沒有問題。其他訂單也沒有問題。

名稱t定義爲Stream模塊中的參數化類型。沒有什麼比這更棘手。

但是,請注意,line_stream_of_channel的返回類型是string Stream.t,而不僅僅是​​。​​本身不是一種類型。 (它是類型級別或類型構造函數)

$ ocaml 
     OCaml version 4.01.0 

# Some 3;; 
- : int option = Some 3 
# ^D 

$ ghci 
GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help 
Prelude> :t Just (3 :: Integer) 
Just (3 :: Integer) :: Maybe Integer 
0

類型可以在OCaml中進行參數化。例如,int list是使用int類型進行參數化的列表,並且在其他一些語言中基本對應於list<int>。這是不是很奇怪?這取決於你的背景。我個人認爲,string list更自然,然後list string

參數化類型的語法是<parameter-type> <parametrized-type>。所以這兩個組件應該是類型。 Stream不是一個類型,它是一個模塊名稱。符號<module-name> . <name>允許您解決在模塊中定義的定義。例如,您可以定義類型別名:

type 'a stream = 'a Stream.t 

,然後用它

type string_stream = string stream 

注意,stream_string聽起來有些不可思議,不是嗎?