Il carattere "_" nella prima funzione anonima è un carattere jolly?

0

Data questa funzione

let readInput() = 
  Seq.initInfinite (fun _ -> Console.ReadLine())
 |> Seq.takeWhile (fun s -> s <> null) '
 |> Seq.map int'

è il _ nella funzione chiamata da Seq.initInfinite un carattere jolly, in modo che qualsiasi cosa possa essere letta da STDIN?

Ho un paio di libri F # diversi, e sto cercando su Internet, ma posso trovare solo riferimenti a _ utilizzati per decomprimere i valori di tupla.

    
posta octopusgrabbus 20.09.2016 - 21:49
fonte

2 risposte

4

is the _ in the function called by Seq.initInfinite a wild card

Sì.

so that anything can be read off STDIN

No. Seq.initInfinite passa un int , che indica l'indice corrente. Ad esempio, puoi usarlo per creare una sequenza infinita di soli numeri pari: Seq.initInfinite (fun i -> i * 2) . Ma nel tuo caso, non ti interessa l'indice, quindi usare _ è appropriato qui.

L'utilizzo del carattere jolly qui non influisce in alcun modo su Console.ReadLine() .

    
risposta data 20.09.2016 - 22:35
fonte
1

Gli identificatori di sottolineatura "Non mi interessa" sono usati in modo efficace come modelli jolly. La differenza con una variabile che sarebbe stata chiamata _ è che ogni occorrenza di _ rappresenta un identificatore diverso; di conseguenza: (1) non puoi fare riferimento allo stesso _ due volte e quindi (2) non viene emesso alcun avviso per mancanza di utilizzo di _ , mentre un altro nome come dummy probabilmente genera un avviso per non essere mai usato .

Il simbolo non interessa è presente nelle lingue con pattern matching incorporato perché a volte vuoi solo abbinare un valore a una particolare struttura e il contenuto effettivo non è importante. Questo accade principalmente in F #, OCaml, Haskell e in particolare in Prolog, ma anche altre lingue potrebbero fornire questo.

Ecco un esempio semplicistico in OCaml:

let empty = function [] -> true | _ :: _ -> false;;

Qui sopra, vuoi solo abbinare liste vuote a liste non vuote. Hai due diversi pattern per dissociare entrambi i casi, ma il contenuto effettivo degli elenchi non vuoti non verrà utilizzato, quindi devi solo inserire caratteri di sottolineatura.

Vedi anche la sezione 2.4 Identificatori e operatori delle specifiche Haskell:

However, “_” all by itself is a reserved identifier, used as wild card in patterns.

Grazie a svick's commento , non devo cercare molto per citazione pertinente per :

Wildcard Pattern

The wildcard pattern is represented by the underscore (_) character and matches any input, just like the variable pattern, except that the input is discarded instead of assigned to a variable. The wildcard pattern is often used within other patterns as a placeholder for values that are not needed in the expression to the right of the -> symbol. The wildcard pattern is also frequently used at the end of a list of patterns to match any unmatched input.

    
risposta data 20.09.2016 - 22:22
fonte

Leggi altre domande sui tag