1

私は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で分割すると同じシーケンスが返されます

4

2 に答える 2

1

最後の行はSeq.mapの代わりにSeq.iterを使用する必要があり、各行を分割する式のスペースが多すぎます。

これらの修正により、正常に機能します。

open System.Net
open System
open System.IO

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") |> splitLines 

let output =
  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.iter (fun (n,_,_) -> Console.Write(n))

let stop = Console.ReadKey()
于 2012-08-02T08:30:59.583 に答える
0

そのURLは生データファイルではなくHTMLページを返していますが、それが問題の原因である可能性がありますか?

また、通常、ページが改行に使用している区切り文字を確認することをお勧めします。0x0Aそれはどちらを使用してい\nますが、時々あなたは見つける\r\nか、めったにありません\r

編集:

また、あなたは印刷を処理するために使用しているように見えますがmap、これはそれを行うための良い方法ではありません。一度に実行すると、サンプルに出力が表示されるのが一般的に難しいことはわかっています。

にマッピングしてn、を使用するなど、他の方法で印刷することをお勧めしSeq.headます。

于 2012-08-01T21:09:17.827 に答える