私は、次のネストされたSeq.map()がコンパイルされ、効果的に働く機能で呼び出しを持っている:次のlint警告を促しF#Lintの警告を避けるためにどのようにリファクタリングするのですか?
|> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) ->
let pricedPortfoliosGroup =
portfolioSeq
|> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) ->
let price =
spsf
|> Seq.map (fun (pfr : PortfolioFundRecord) -> pfr.Fund.ClosingPrice * float pfr.PortfolioWeight/100.0)
|> Seq.reduce (+)
let topPortfolioFundRecord = spsf |> Seq.head
{ PortfolioId = p; Price = price; TradedOn = topPortfolioFundRecord.Fund.TradedOn }
)
(tradedOnKey, pricedPortfoliosGroup)
)
:
リント:
Seq.map f (Seq.map g x)
を可能することができるかもしれませんSeq.map (g >>f) x
にリファクタリングされました。|> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) -> let pricedPortfoliosGroup = portfolioSeq |> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) ->
が、私は私の第二のパラメータが順序であるので、それらをリファクタリングする方法がわからないと、私は「それを変換したい:
私は警告がこれらのトップ2のマップの呼び出しによって促されると考えています"それを平らにしないでください。
これを行う方法を提案できますか?私はまた、そのコード断片だけのリント警告をオフにする方法を探しましたが、動力工具はそれを行う方法を提供していないようです。ここで
は完全酒のために全体の機能です:あなたの第二のトップレベルSeq.map
で
let getPortfoliosPrices(dbFundsWithPortfolioFunds : (DbFunds * DbPortfolioFunds) Linq.IQueryable)(takenDays: int) =
let portfolioPrices =
dbFundsWithPortfolioFunds
|> Seq.collect(fun (f : DbFunds, fp : DbPortfolioFunds) ->
takenDays |> getStockPrices f.Symbol
|> Seq.map(fun(quote : FundQuote) ->
let portfolioFundRec = {PortfolioId = fp.PortfolioId; PortfolioWeight = fp.Weight; Fund = quote}
portfolioFundRec)
)
|> Seq.groupBy(fun (portfolioFundRec : PortfolioFundRecord) -> portfolioFundRec.Fund.TradedOn)
|> Seq.map(fun (tradedOnKey : DateTime, spfr : PortfolioFundRecord seq) ->
let gpfr = spfr |> Seq.groupBy (fun(pfr : PortfolioFundRecord)->pfr.PortfolioId)
(tradedOnKey, gpfr)
)
|> Seq.map (fun (tradedOnKey : DateTime, portfolioSeq : seq<PortfolioId * seq<PortfolioFundRecord>>) ->
let pricedPortfoliosGroup =
portfolioSeq
|> Seq.map (fun (p : PortfolioId, spsf : (seq<PortfolioFundRecord>)) ->
let price =
spsf
|> Seq.map (fun (pfr : PortfolioFundRecord) -> pfr.Fund.ClosingPrice * float pfr.PortfolioWeight/100.0)
|> Seq.reduce (+)
let topPortfolioFundRecord = spsf |> Seq.head
{ PortfolioId = p; Price = price; TradedOn = topPortfolioFundRecord.Fund.TradedOn }
)
(tradedOnKey, pricedPortfoliosGroup)
)
portfolioPrices
警告はネストされたマップ呼び出しではなく、一連のマップ呼び出しです。あなたのコードでどこが起こっているのか、おそらくmap-groupBy-mapを実行している場所で起こっているかもしれません。 – scrwtp
トピックからやや離れていますが、そのような多くの型の注釈を記述する具体的な理由はありますか?私はそれらの90%を取り除き、もっと読みやすいコードを得ることができると思います。 –
@Anton中間の形状の速度を上げることで、関数のライフタイムメンテナンスが向上します。いくつかの中間的なマップ - > "ブレークポイント"またはprintfn関数を中断するが、あまりにも混乱する可能性があります。スタイルとして、私は注釈もドキュメントの形式と同じようにタイプするよう指導されました。私はこれが誰にとっても人気のある選択ではないかもしれないと理解しています。 – Mario