2016-05-07 9 views
7

ho deliberatamente aggiunto x alla fine di questa funzionePerché questi argomenti hanno dedotto un tipo di unità?

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

mi aspettavo che X e Y argomenti sono ancora di 'un tipo, ma ho questa firma invece:

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

Perché questi argomenti dedotti per avere un tipo di unità?

Modifica: Grazie a @gilles per la risposta. Considera queste due funzioni:

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 

Che cosa differenzia le due firme? Sembra come nella seconda funzione il compilatore interpretare il risultato del confronto x -sia o Y come unità

risposta

7

Scriviamo un esempio più semplice:

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

In un'espressione composta, l'espressione prima della virgola/L'operatore newline deve avere il tipo di unità. Se si desidera utilizzare un'espressione con un valore "reale" (vale a dire qualsiasi cosa di un tipo diverso dall'unità), è necessario ignorarlo esplicitamente o associarlo a un modello senza variabile. Il compilatore si ricorda se il tipo di espressione non può essere unificato con 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]> 

Sarebbe possibile avere una regola di digitazione che permette a qualsiasi tipo prima ; - il valore viene ignorato, dopo tutto, così il suo tipo non importa - ma questo renderebbe facile scartare accidentalmente un valore di ritorno che conta. Quindi, se si desidera ignorare il valore, farlo in modo esplicito:

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

o

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

Vorrei anche aggiungere che se vi trovate usando 'ignore', le probabilità sono, si sta facendo qualcosa di sbagliato . Anche questo particolare esempio non è un'eccezione: l'espressione 'if-then' non ha alcun senso, perché il suo valore restituito viene gettato via e non produce effetti collaterali. –

Problemi correlati