假設我有一些代碼:我如何在列表中做一輛汽車和一輛卡車?
let listB = [ 1; 2; 3 ]
使用Lisp的符號,我該怎麼做一個car
和cadr
對這個名單?我知道缺點是::
。
Or in Scheme,first
and rest
?
假設我有一些代碼:我如何在列表中做一輛汽車和一輛卡車?
let listB = [ 1; 2; 3 ]
使用Lisp的符號,我該怎麼做一個car
和cadr
對這個名單?我知道缺點是::
。
Or in Scheme,first
and rest
?
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]
List.hd和List.tl會做你想要的東西 - 但在F#中,你會發現,列表通常使用模式匹配解構。例如,在下面的函數x頭部匹配和xs傳遞給函數列表的尾部相匹配:
let list = [1;2;3]
let rec f = function
| [] -> 1
| (x::xs) -> x * (f xs)
f list;
我將有simonuk同意。儘管像CMS提到的那樣,hd
和tl
是正確的功能,但是對於那個論點來說還有更多。
當使用模式匹配時,您可以利用編譯器捕獲(基本)可能錯過的案例(例如列表爲空時)。你絕對可以捕獲或繼續拋出這個異常,但是你並不需要,如果這種期望不經常發生,你可能會引入錯誤。所以養成利用模式匹配的習慣是一種很好的編程習慣。對於所有意圖和目的,調用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!