Hãy để tôi mở rộng Etienne của câu trả lời một chút với một số ví dụ:
let x :: xs as list = [1;2;3];;
val x : int = 1
val xs : int list = [2; 3]
val list : int list = [1; 2; 3]
Khi bạn viết <pattern> as <name>
, biến <name>
được ràng buộc với toàn bộ hoa văn trên bên trái, nói cách khác, phạm vi của as
kéo dài càng xa càng tốt (nói kỹ thuật hơn as
có mức độ ưu tiên thấp hơn các nhà xây dựng, tức là, các nhà xây dựng liên kết chặt chẽ hơn). Vì vậy, trong trường hợp khớp mẫu sâu, bạn có thể cần phải sử dụng dấu ngoặc đơn để giới hạn phạm vi, ví dụ:
let [x;y] as fst :: ([z] as snd) :: xs as list = [[1;2];[3]; [4]];;
val x : int = 1
val y : int = 2
val fst : int list = [1; 2]
val z : int = 3
val snd : int list = [3]
val xs : int list list = [[4]]
val list : int list list = [[1; 2]; [3]; [4]]