2016-11-02 31 views
5

Ví dụ hàm sau:Ống (|) có nghĩa là gì trong Lập trình ML?

fun fac (0 : int) : int = 1 
    | fac (n : int) : int = n * fac (n - 1) 

Hoặc trong hàm:

fun even 0 = true 
    | even x = odd(x-1) 
and odd 0 = false 
    | odd x = even(x-1); 

Tôi có chút kinh nghiệm với ML và tôi chỉ cố gắng tìm hiểu những điều cơ bản.

Trả lời

6

Đây là pattern matching. Từ liên kết:

Các chức năng có thể bao gồm một hoặc nhiều quy tắc. Một quy tắc bao gồm tên hàm, mẫu đối số và biểu thức của nó. Khi hàm được gọi là các giá trị đối số sẽ được khớp với các mẫu trong thứ tự từ trên xuống. Các hàm sử dụng đối sánh mẫu rất giống với các biểu thức trường hợp

Điều này có nghĩa là đường ống phân cách các trường hợp khớp mẫu. So khớp mẫu khớp với các mẫu đặc biệt và thực hiện các biểu thức cụ thể dựa trên mẫu đó. Họ làm theo cú pháp:

fun <fun-name> <pattern> 
    | <fun-name> <pattern> 
    | <fun-name> <pattern>; 

đâu <pattern> là:

<args> = <expressions> 

Trong ví dụ đầu tiên của bạn, nó được tuyên bố chức năng fac để tính giai thừa. Mẫu đầu tiên là khi đối số, int là 0. Nếu int bằng 0, biểu thức của trường hợp đó sẽ thực thi, và trong trường hợp này nếu đối số được truyền là 0, kết quả sẽ là 1 (vì 0 giai thừa là 1). Nếu đối số đã vượt qua, không phải là 0 thì nó tuân theo mẫu tiếp theo (vì nó không khớp với mẫu đầu tiên). Nếu đối số được truyền là, nói 2, nó sẽ thực hiện đệ quy và tìm giai thừa cho phù hợp.


Hãy xem xét đoạn mã dưới đây:

fun past "run" = "ran" 
    | past "swim" = "swam" 
    | past x  = x^"ed"; 

Chúng ta định nghĩa hàm có tên past rằng có một đối số và tìm thấy những căng thẳng thông qua các cuộc tranh cãi. Mẫu đầu tiên tương đương với - bằng tiếng Anh đơn giản:

nếu từ (hoặc đối số được truyền) là "chạy", thì thì được truyền là "chạy".

Các mô hình thứ hai là tương đương với:

nếu từ (hoặc đối số truyền) là "bơi", các căng thẳng thông qua là "bơi".

Nếu từ không phải là "bơi" hoặc "chạy" (và do đó hai mẫu không khớp) tiếp tục với mẫu cuối cùng, chỉ thêm "ed" vào cuối từ.

Với ví dụ bạn có thể thấy các biểu tượng riêng biệt | (ống). Bạn có thể nghĩ về các mẫu như mã giả này:

if argument is "run", then passed tense is "ran" 
else if argument is "swim", then passed tense is "swam" 
else add "ed" to end of word 

Kết hợp mẫu được sử dụng để bao gồm các trường hợp bất thường.Kể từ khi "chạy" và "bơi" là bất thường thông qua các tenses, chúng tôi bao gồm những trường hợp với các mẫu. Nguyên tắc chính xác tương tự áp dụng cho ví dụ đầu tiên - 0! là một trường hợp đặc biệt, đó là 1. Bởi vì điều này, chúng ta có thể sử dụng mẫu phù hợp để khớp với trường hợp cụ thể trong đó đối số là 0 và thực thi theo trường hợp cụ thể đó.

+0

Bạn có thể giải thích cách bài đăng này không vi phạm https://meta.stackoverflow.com/questions/351354/ cần-i-be-trả lời-mã-yêu cầu? Tôi hợp pháp không hiểu. – gregblass

+0

@gregblass Câu hỏi này không yêu cầu phải có một số mã được viết cho chúng, nó yêu cầu giải thích khái niệm. – Li357

0

Những gì bạn thấy là cú pháp phím tắt để xác định hàm và đối sánh mẫu trên đối số cùng một lúc. Nếu bạn tách mẫu phù hợp khỏi định nghĩa chức năng, nó sẽ trông giống như sau:

fun fac (x : int) : int = 
    case x of 
    0 => 1 
    | n => n * fac (n - 1) 
Các vấn đề liên quan