Domanda

Sto imparando F # e ho riscontrato un errore intellisense

let rec fib n = 
    match n with
    | 1 -> 1
    | 2 -> 2
    | _ -> fib(n-1) + fib(n-2)

fib 6 <-- This line says "This expression should have type 'unit', but has type 'int'

Qualcuno sa come posso risolvere questo problema?

È stato utile?

Soluzione

Se stai digitando quel codice in una console interattiva, ti aspetteresti che stampi la risposta. Ma in un programma, dovresti scrivere una riga di codice che fa qualcosa con il valore restituito dalla tua funzione fib. Dai un nome al risultato o scrivilo sulla console (che avrebbe il tipo unit, cioè & Quot; azione senza valore di ritorno & Quot;) o qualcosa del genere.

Altri suggerimenti

Ho pensato di aggiungere che stai definendo la tua ricorrenza dei fibonacci in modo errato. Dai un'occhiata qui al tuo codice:

let rec fib n =
    match n with
    | 1 -> 1
    | 2 -> 2
    | _ -> fib(n-1) + fib(n-2);;

Ora consente di mappare questa funzione su un elenco:

[0 .. 8] |> List.map fib

Il processo è terminato a causa di StackOverflowException.

Rilevamento della fine della sessione.

Premi Invio per riavviare.

Ops.

Anche se modifico la comprensione della mia lista per non includere zero:

[1 .. 8] |> List.map fib

val it: int list = [1; 2; 3; 5; 8; 13; 21; 34]

Otteniamo qualcosa di simile alla sequenza fibonacci ma non alla sequenza esatta ... Potresti non pensare che questo sia importante per imparare perché si è verificato il tuo errore intellisense ...

Ma guarda attentamente questo ora ... nota anche che sto usando 'n' invece di '_':

let rec fib n =
    match n with
    | 0 -> 0
    | 1 -> 1
    | n -> fib(n-1) + fib(n-2);;

val fib: int - > int

[0 .. 8] |> List.map fib;;

val it: int list = [0; 1; 1; 2; 3; 5; 8; 13; 21]

Ora questa è la sequenza corretta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top