Qual é o estilo mais idiomático para forçar um cálculo usando sequências em f#?
Pergunta
Eu tenho uma operação colateral eficaz
securities |> Seq.map (fun x -> request.Append("securities",x))
Qual é a maneira mais idiomática de executar o código?
Eu escrevi um Seq.Doit, mas coça
module Seq =
let Doit sa = sa |> Seq.toArray |> ignore
Solução
As sequências diferidas são usadas quando você cria sequências usando Seq.delay
ou expressão de sequência seq{}.Qualquer função na sequência retornando qualquer tipo de dados diferente seq
pode forçar a computação.
Alternativamente, você pode usar for
loop em vez de Seq.iter
:
for s in securities do
request.Append("securities", s)
Se você quiser ocultar os efeitos colaterais e retornar request
para uso posterior, Seq.fold
é uma boa escolha:
securities |> Seq.fold (fun acc x -> acc.Append("securities", x); acc) request
Outras dicas
Eu penso Seq.iter
é apropriado neste caso.Na página de referência do MSDN:
Seq.iter : ('T -> unit) -> seq<'T> -> unit
Aplica a função fornecida a cada elemento da coleção.
Então, supondo que request.Append
não retorna nada, seu código se torna:
securities |> Seq.iter (fun x -> request.Append("securities", x))