2008-11-12 60 views

回答

5

List.head:返回非空列表的第一個元素(列表的頭部)

List.tail:返回一個非空 列表的除第一(尾部或列表的其餘部分)所有元素。

例(使用F#交互式控制檯):

> let sample = [1;2;3;4];; 

val sample : int list 

> List.head sample;; 

val it : int = 1 

> List.tail sample;; 

val it : int list = [2; 3; 4] 
6

List.hd和List.tl會做你想要的東西 - 但在F#中,你會發現,列表通常使用模式匹配解構。例如,在下面的函數x頭部匹配和xs傳遞給函數列表的尾部相匹配:

let list = [1;2;3] 

let rec f = function 
    | [] -> 1 
    | (x::xs) -> x * (f xs) 

f list; 
2

我將有simonuk同意。儘管像CMS提到的那樣,hdtl是正確的功能,但是對於那個論點來說還有更多。

當使用模式匹配時,您可以利用編譯器捕獲(基本)可能錯過的案例(例如列表爲空時)。你絕對可以捕獲或繼續拋出這個異常,但是你並不需要,如果這種期望不經常發生,你可能會引入錯誤。所以養成利用模式匹配的習慣是一種很好的編程習慣。對於所有意圖和目的,調用hd/tl時所應用的實際功能與模式匹配。其實,在OCaml中,它是失敗的:

let hd = function [] -> failwith "hd" | a::l -> a 
let tl = function [] -> failwith "tl" | a::l -> l 

作爲一個例子,而不是使用異常/失敗,我們可能會發現更理想的使用options

> let car = function | hd::tl -> Some hd | _ -> None 
> let cdr = function | hd::[] -> None | hd :: tl -> Some tl | _ -> None 

而且,警惕使用_以匹配任何東西。當你決定添加另一種類型時,它會在變體類型中傷害更多... opps!

相關問題