2017-11-08 20 views
8

Trong Haskell, trong khi khớp mẫu, tôi có thể sử dụng @ để lấy toàn bộ cấu trúc trong một mẫu. (Đối với Google dễ dàng hơn, cấu trúc này được gọi là dạng.)OCaml tương đương với Haskell's @ trong mẫu phù hợp (a.k.a. as-pattern)

Ví dụ: x:xs phân hủy danh sách thành đầu và đuôi; Tôi cũng có thể lấy toàn bộ danh sách với [email protected](x:xs).

OCaml có nội dung như thế này không?

Trả lời

15

Bạn có thể sử dụng as:

let f = function 
| [] -> (* ... *) 
| (x::xs) as l -> 
    (* 
    here: 
    - x is the head 
    - xs is the tail 
    - l is the whole list 
    *) 
10

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]] 
Các vấn đề liên quan