2013-01-17 40 views
6

Tôi bắt đầu học ML chuẩn với khóa học Programming languages.SML và kiểu mã hóa chức năng

Trong bài tập về nhà đầu tiên, tôi cố gắng viết hàm is_older có hai ngày và đánh giá là true hoặc false. Nó đánh giá thành true nếu đối số đầu tiên là ngày xuất hiện trước đối số thứ hai (Nếu hai ngày giống nhau, kết quả là false.).

Vì vậy, tôi viết đoạn mã sau:

fun is_older(first: int * int * int, second: int * int * int) = 
    if(#1 first = #1 second andalso #2 first = #2 second andalso #3 first = #3 second) then false 
    else if (#1 first < #1 second) then true 
    else if (#1 first = #1 second andalso #2 first < #2 second) then true 
    else if (#1 first = #1 second andalso #2 first = #2 second andalso #3 first < #3 second) then true 
    else false 

Mã này là hoạt động tốt, nhưng có vẻ xấu xí.

Tôi làm cách nào để viết lại mã này theo kiểu chức năng?

Trả lời

12

Hai gợi ý:

  • Sử dụng mô hình phù hợp để phân hủy các bộ.
  • Sử dụng toán tử boolean (andalso, orelse, v.v.) khi if/else tạo cấu trúc trả về boolean.

Một phiên bản dễ đọc hơn:

(* Compare two dates in the form of (year, month, day) *) 
fun is_older((y1, m1, d1), (y2, m2, d2)) = 
    y1 < y2 orelse (y1 = y2 andalso m1 < m2) 
    orelse (y1 = y2 andalso m1 = m2 andalso d1 < d2) 
9

Nói chung khi bạn có một cái gì đó về hình thức

if b then 
    true 
else 
    false 

bạn nên trao đổi nó với chỉ b, vì nó được xem trivially là tương tự. Các giải pháp được cung cấp bởi pad có lẽ cũng đã được giải pháp của tôi, vì nó là tốt đẹp và ngắn.

Tuy nhiên, khi bạn kết thúc những điều khó chịu/lồng nhau nếu-thì-người khác, và bạn không trả về một cái gì đó đơn giản (ví dụ, true/false hoặc một số), thì bạn nên xem xét sử dụng một trường hợp. Chức năng của bạn không phải là một ứng cử viên để sử dụng, tuy nhiên tôi hy vọng các bên dưới vẫn thể hiện những ý tưởng (mà bạn có thể dễ dàng làm cho cấu trúc của những lồng nhau nếu nhân)

fun is_older((y1, m1, d1), (y2, m2, d2)) = 
    case (Int.compare(y1,y2), Int.compare(m1,m2), Int.compare(d1, d2)) of 
     (LESS , _ , _ ) => true 
    | (EQUAL, LESS , _ ) => true 
    | (EQUAL, EQUAL, LESS) => true 
    | _ => false 
1
fun is_older((yr1 : int , mo1 : int , dt1 : int), (yr2 : int , mo2 : int , dt2 : int)) = 
    yr1 < yr2 orelse (yr1 = yr2 andalso mo1 < mo2) 
    orelse (yr1 = yr2 andalso mo1 = mo2 andalso dt1 < dt2) 
+1

Thêm một số ý kiến ​​sẽ giúp người khác hiểu propposal câu trả lời của bạn . – Yaroslav

Các vấn đề liên quan