私はF#を初めて使用し、このカタを解決しようとしています
ファイルfootball.datには、2001/2の英国プレミアリーグの結果が含まれています。「F」と「A」のラベルが付いた列には、そのシーズンに各チームに対して得点されたゴールの総数が含まれます(したがって、アーセナルは対戦相手に対して79ゴールを獲得し、36ゴールを獲得しました)。「for」と「against」の目標の差が最も小さいチームの名前を印刷するプログラムを作成します。
ファイルを保存し、File.ReadAllLinesを使用して読み取ると、私のソリューションは機能します。
open System.IO
open System
let split (s:string) =
let cells = Array.ofSeq(s.Split([|' '|],StringSplitOptions.RemoveEmptyEntries))
(cells.[1], int cells.[6], int cells.[8])
let balance t =
let (_,f,a) = t
-(f-a)
let lines = List.ofSeq(File.ReadAllLines(@"F:\Users\Igor\Downloads\football.dat"));;
lines
|> Seq.skip 5
|> Seq.filter (fun (s:string) -> s.Split([|' '|],StringSplitOptions.RemoveEmptyEntries).Length = 10)
|> Seq.map split
|> Seq.sortBy balance
|> Seq.take 1
|> Seq.map (fun (n,_,_) -> printfn "%s" n)
しかし、ファイルを読み取る代わりに、WebClientを使用してファイルをダウンロードし、行を分割すると、残りのコードは機能しません。シーケンスは同じ長さですが、F#Interactiveは要素を表示せず、出力を出力しません。コードは
open System.Net
open System
let split (s:string) =
let cells = Array.ofSeq(s.Split([|' '|],StringSplitOptions.RemoveEmptyEntries))
(cells.[1], int cells.[6], int cells.[8])
let balance t =
let (_,f,a) = t
-(f-a)
let splitLines (s:string) =
List.ofSeq(s.Split([|'\n'|]))
let wc = new WebClient()
let lines = wc.DownloadString("http://pragdave.pragprog.com/data/football.dat")
lines
|> splitLines
|> Seq.skip 5
|> Seq.filter (fun (s:string) -> s.Split([|' '|],StringSplitOptions.RemoveEmptyEntries).Length = 10)
|> Seq.map split
|> Seq.sortBy balance
|> Seq.take 1
|> Seq.map (fun (n,_,_) -> printfn "%s" n)
違いはなんですか?List.ofSeq(File.ReadAllLines ..)はシーケンスを再調整し、インターネットからファイルをダウンロードして\nで分割すると同じシーケンスが返されます