Qual é a diferença entre estas duas sequências F #?
Pergunta
> seq { for i in 0..3 do yield float i };;
val it : seq<float> = seq [0.0; 1.0; 2.0; 3.0]
> seq [ for i in 0..3 do yield float i ];;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]
P.S. por que F # esperar originalmente seqüências sem o prefixo "seq", mas agora eles querem o prefixo?
Solução
Mais esclarecimentos sobre as duas formas que você postou:
O primeiro usa uma compreensão seqüência direta, "seq {...}". A parte "seq" era opcional antes, mas isso não vai ser suportado no futuro. Eu acho que faz coisas como "async {...}" e a sintaxe do fluxo de trabalho mais difícil ou algo assim.
Agora, o segundo é uma lista pura:
> let x = [ for i in 0..3 do yield float i ];;
val x : float list
"seq" é também uma função:
> seq;;
val it : (seq<'a> -> seq<'a>) = <fun:clo@0_1>
E uma vez que qualquer lista também é uma seqüência, fazendo "seq [1; 2; 3;]" está apenas aplicando a função seq para a lista. É meio como lançando-a seq do tipo de lista.
> x;;
val it : float list = [0.0; 1.0; 2.0; 3.0]
> seq x;;
val it : seq<float> = [0.0; 1.0; 2.0; 3.0]
Edit: A fonte para a função seq é:
let seq (x : seq<_>) = (x :> seq<_>)
Assim, "sorta como convertê-lo" deve ler "convertê-lo através de uma função auxiliar". Como para a impressão de seqüências dentro de parênteses, eu acho que é apenas um artefato de impressão bonita.
Outras dicas
O primeiro é uma seq (IEnumerable).
O segundo é estranho; se livrar do 'seq' e é uma compreensão de lista (lista). Não há nenhuma razão para escrevê-lo como é; tanto para uso seq {} ou [] ou [| |] Para fazer uma seq ou uma lista ou um array
.Os curlies-não-prefixado-by-seq é um formulário que se tornará obsoleto, uma vez que faz com que algumas outras partes da linguagem potencialmente ambígua.