ようこそ。睡眠不足なプログラマのチラ裏です。

パケットの送受信量(F#) - ループとbreak

元ネタ
パケットの送受信量 (C#)(F#) - SIN@SAPPOROWORKSの覚書
http://d.hatena.ne.jp/spw0022/20111116/1321437712


確かにC#VBJavaなどの手続き型言語でのプログラミングに慣れていると、最初はそう思っちゃいますよね。
これぞ「ループでbreak脳の恐怖!」...って、私もその道を通りました。


方法1:再帰を使う

open System
open System.Net.NetworkInformation

let ar = 
    NetworkInterface.GetAllNetworkInterfaces()
    |>Seq.map(fun n -> n,n.GetIPv4Statistics())
    |>Seq.map(fun (n,s) -> n.Description,s.BytesReceived,s.BytesSent)

let rec loop func = 
  match func () with
  | ConsoleKey.X -> () 
  | _ -> loop func 

let func () = 
  printfn "%-45s\t%-10s\t%-10s" "Description" "Recv" "Send"
  printfn "-------------------------------------------------------------------------"
  ar|>Seq.iter(fun (d,r,s) -> printfn "%-15s\t%10d\t%10d" d r s)
  printfn ""
  printfn "何かのキーを押すと更新されます(Xで終了)"
  Console.ReadKey().Key |> fun key -> Console.Clear()
                                      key
loop func 

方法2:無限シーケンスを使う

open System
open System.Net.NetworkInformation

let ar = 
    NetworkInterface.GetAllNetworkInterfaces()
    |>Seq.map(fun n -> n,n.GetIPv4Statistics())
    |>Seq.map(fun (n,s) -> n.Description,s.BytesReceived,s.BytesSent)

let func () = 
  printfn "%-45s\t%-10s\t%-10s" "Description" "Recv" "Send"
  printfn "-------------------------------------------------------------------------"
  ar|>Seq.iter(fun (d,r,s) -> printfn "%-15s\t%10d\t%10d" d r s)
  printfn ""
  printfn "何かのキーを押すと更新されます(Xで終了)"
  let key = Console.ReadKey().Key
  Console.Clear()
  key 

let infiniteSeq = Seq.initInfinite (fun _ -> func())
let run item = if item = ConsoleKey.X then 
                 Some(item)
               else None
 
Seq.pick run infiniteSeq |> ignore


ループでbreakを表現する方法は、他にもいろいろあるでしょう。


■関連リンク

F#で楽々breakとcontinue。継続モナドまじパネぇっす!
http://d.hatena.ne.jp/zecl/20110322/p1

ふと、Seq.tryFindの変な(誰得な)使い方を思いついた。F#でbreakとcontinue再び。
http://d.hatena.ne.jp/zecl/20110822/p1



様々な角度から 物事を見ても、自分を見失わずにありたい。



補足
いくつか Seq.initInfinite 関係のツイートを拾ってみました。


ということで、Seq.initInfiniteのご利用は計画的に。

観たやつ

#572. ゴールデンスランバー
ゴールデンスランバー [Blu-ray]
面白く観れたのですが、いろいろ違和感もある。
狂った殺人犯を演じた濱田岳が意外とあってたかな。


#573. ダイヤモンド・イン・パラダイス
ダイヤモンド・イン・パラダイス オリジナル・サウンドトラック
これはなかなかよい娯楽映画。
FBI捜査官スタンとのからみがいい味でてると思う。


#574. トリコロールに燃えて
トリコロールに燃えて スペシャル・エディション [DVD]
シャリーズ・セロンの魅力がよくでてる映画ですな。


#575. リード・マイ・リップス
リード・マイ・リップス [DVD]
フランス映画。ラブストーリーかと思えば犯罪サスペンスもの。
映画好きなら見ておきたい。


#576. チルソクの夏
チルソクの夏 特別版 [DVD]
あかぬけてない上野樹里がいいね。


#577. 悪霊喰
悪霊喰 [DVD]
設定そのものは悪くないし、ヒース・レジャーもかっこいいんですが、
怖くもないし、面白くもなかった。邦題もイケてない。


#578. ビッグ
ビッグ [DVD]
若かれし頃のトム・ハンクスを楽しめる良作。


#579. センター・オブ・ジ・アース
センター・オブ・ジ・アース [DVD]
ブレンダン・フレイザー主演。ディズニーシーにあるアトラクション「センター・オブ・ジ・アース」を元にした映画らしい。
ドラえもん のび太の創世日記」ではありません。ハムナプトラよりは好きです。


#580. 鉄コン筋クリート
鉄コン筋クリート (通常版) [DVD]
ぐりぐり動くゼ!


#581. 名探偵コナン 戦慄の楽譜
劇場版 名探偵コナン 戦慄の楽譜(フルスコア) スペシャル・エディション [DVD]
ふつうにテレビでやってもよさそうな内容。コナン映画のクオリティの低下を感じざるを得ない。
コナンの映画では、「天国へのカウントダウン」や「ベイカー街の亡霊」アタリが好きです。