2016-05-07 22 views
7

tôi cố tình thêm x đến hết chức năng nàyTại sao các đối số này được suy ra để có loại đơn vị?

let myMax x y = 
    if x > y then x else y 
    x 

Tôi đã mong rằng x và y đối số vẫn của 'một loại là, nhưng tôi nhận được chữ ký này để thay thế:

myMax : x:unit -> y:unit -> unit 

Tại sao những các đối số suy ra để có một loại đơn vị?

Chỉnh sửa: Cảm ơn bạn @gilles cho câu trả lời. Hãy xem xét hai chức năng sau:

let foo x y = 
    0    // warning 
    x 
val foo : x:'a -> y:'b -> 'a 

let foo2 x y = 
    if x > y then x else y // no warning 
    x 
val foo2 : x:unit -> y:unit -> unit 

Điều gì làm cho hai chữ ký khác nhau? Có vẻ như trong hàm thứ hai trình biên dịch giải thích kết quả của việc so sánh x -either hoặc Y-như đơn vị

Trả lời

7

Hãy viết một ví dụ đơn giản:

> fun x -> x; 0;;   
val it : unit -> int = <fun:[email protected]> 

Trong một biểu thức hợp chất, khái niệm trước dấu chấm phẩy/toán tử newline phải có loại đơn vị. Nếu bạn muốn sử dụng biểu thức có giá trị "thực" (nghĩa là bất kỳ thứ gì khác ngoài loại), bạn cần phải bỏ qua nó một cách rõ ràng hoặc liên kết nó với mẫu không biến đổi. Trình biên dịch nhắc nhở bạn nếu loại của biểu hiện không thể thống nhất với unit:

> fun x -> 0; x;; 

    fun x -> 0; x;; 
    ---------^ 

stdin(7,10): warning FS0020: This expression should have type 'unit', but has type 'int'. 
Use 'ignore' to discard the result of the expression, 
or 'let' to bind the result to a name. 
val it : x:'a -> 'a = <fun:[email protected]> 

Nó sẽ có thể để có một quy tắc gõ cho phép bất kỳ loại trước ; - giá trị được bỏ qua, sau khi tất cả, vì vậy loại của nó không quan trọng - nhưng điều đó sẽ làm cho nó dễ dàng vô tình loại bỏ một giá trị trả về quan trọng. Vì vậy, nếu bạn muốn bỏ qua các giá trị, làm như vậy một cách rõ ràng:

let myMax x y = 
    ignore (if x > y then x else y) 
    x 

hoặc

let myMax x y = 
    let _ = if x > y then x else y 
    x 
+3

Tôi cũng muốn nói thêm rằng nếu bạn thấy mình sử dụng 'ignore', rất có thể, bạn đang làm điều gì sai . Ví dụ cụ thể này cũng không phải là một ngoại lệ: biểu thức 'if-then' không có nghĩa gì cả, bởi vì giá trị trả về của nó bị vứt đi và nó không tạo ra bất kỳ tác dụng phụ nào. –

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