04

13

F#プログラミングメモ #3

2011.04.13(23:52)

私も同期版と非同期版のHTTPクライアントを書いてみた。洗練はこれから。


// FSharp-2.0.0.0
open System.IO;;
open System.Net;;

let getTitle (html : string) =
let startPos = html.IndexOf("<title>")+7 in
let endPos = html.IndexOf("</title>") in
let title = html.Substring(startPos, endPos - startPos) in
title;;

// 同期版
let SyncHttp (url:string) =
let req = WebRequest.Create(url)
#if use_proxy
req.Proxy <- new WebProxy("http://10.0.xx.xx:8080")
#endif
use rsp = req.GetResponse() in
use stream = rsp.GetResponseStream() in
use reader = new StreamReader(stream) in
let html = reader.ReadToEnd() in
getTitle(html) |> printfn "SyncHttp [%s]";;

let pages =
[|
SyncHttp "http://www.google.co.jp/";
SyncHttp "http://news.google.co.jp/nwshp?hl=ja&tab=wn";
SyncHttp "http://www.yahoo.co.jp/";
|];;

// 非同期版
type System.Net.WebRequest with
member x.GetResponseAsync() =
Async.FromBeginEnd(x.BeginGetResponse, x.EndGetResponse)

let AsyncHttp (url:string) =
async { let req = WebRequest.Create(url) in
#if use_proxy
req.Proxy <- new WebProxy("http://10.0.xx.xx:8080")
#endif
let! rsp = req.GetResponseAsync() in
use stream = rsp.GetResponseStream() in
use reader = new StreamReader(stream) in
let html = reader.ReadToEnd() in
getTitle(html) |> printfn "AsyncHttp [%s]"
};;

let Sleeping n =
async { do! Async.Sleep(n)
printfn "timeount %d ms" n
};;

Async.RunSynchronously ( AsyncHttp "http://www.google.com"; )

Async.RunSynchronously ( Async.Parallel [ Sleeping(2000);
AsyncHttp "http://www.google.com";
AsyncHttp "http://news.google.co.jp/nwshp?hl=ja&tab=wn";
AsyncHttp "http://www.yahoo.co.jp/";
Sleeping(1000);
]);;


実行結果

SyncHttp [Google]
SyncHttp [Google ニュース]
SyncHttp [Yahoo! JAPAN]
AsyncHttp [Google]
AsyncHttp [Yahoo! JAPAN]
AsyncHttp [Google ニュース]
AsyncHttp [Google]
timeount 1000 ms
timeount 2000 ms

04

13

F#プログラミングメモ #2

2011.04.13(20:04)

F#言語 構文解釈確認用プログラム


// コンパイラディレクティブ
// http://msdn.microsoft.com/ja-jp/library/dd233195.aspx
// 軽量構文
#light
#if hoge
printfn "hoge is defined";;
#else
printfn "hoge is not defined";;
#endif
// ソース行、ファイル、およびパスの識別子 (F#)
// http://msdn.microsoft.com/ja-jp/library/dd233234.aspx
let printSourceLocation() =
printfn "Line: %s" __LINE__
printfn "Source Directory: %s" __SOURCE_DIRECTORY__
printfn "Source File: %s" __SOURCE_FILE__;;
printSourceLocation();;
// hello world と日本語
printfn "こんにちは、F#です\n"
// 複数行コメント
(* これはF#の
複数行
コメントです。 *)
(* これはF#の
(* 複数行 *)
コメントです。 *)
// マルチラインストリングリテラル
printfn "マルチライン
ストリングリテラル";;

// 普通の文字列はエスケープが処理される
let path1 = "E:\\FSharp\\src\\hello.fsx"
// 逐語的文字列リテラル @"文字列"
let path2 = @"E:\FSharp\src\hello.fsx"
printfn "%s" path1
printfn "%s" path2
printfn "%b" (path1 = path2)

let str1 = "abc def";;
printfn "%s" (str1.Replace("abc","ABC"));;

let str3 = "abstract and as asr assert atomic base begin break checked class component const constraint constructor continue default delegate do done downcast downto eager elif else end event exception extern external false finally fixed for fun function functor global if in include inherit inline interface internal land lazy let lor lsl lsr lxor match member method mixin mod module mutable namespace new null object of open or override parallel private process protected public pure rec return sealed sig static struct tailcall then to trait true try type upcast use val virtual void volatile when while with yield"
printfn "%s" (str3.Replace('\n',' '));;



EmEditor用 F#言語 構文ファイルを作成しました。
ダウンロード
http://blog-imgs-31.fc2.com/s/a/l/saltheads/fsharp_esy.txt
テキストファイル。これをダウンロードして、fsharp.esy に rename し、
あとは、
EmEditor 構文ファイルのインストール方法
http://jp.emeditor.com/modules/xoopsfaq/index.php?cat_id=1#q3
を参照。
ファイル名との関連付けは、
.fs, .fsi, .fsx and .fsscript
で終わるファイル名に関連付けすればいいだろう。

emurasoft.com にメールで送付してあるので、そのうちに以下のところに載るかも。
http://jp.emeditor.com/modules/mydownloads/viewcat.php?cid=24

04

13

F#プログラミングメモ #1

2011.04.13(19:57)

F#プログラミングで参考にしたものリンク集

F# User Group - Japan F#リンク集
http://bit.ly/gtOoos

ツイッター
F#の世界的なハッシュタグ #fsharp
http://twitter.com/#search?q=%23fsharp
日本人のつぶやきを選んで読むのはちょっとたいへん。

実践 F# 関数型プログラミング入門 荒井 省三 いげ太 (著)
http://www.amazon.co.jp/dp/4774145165/

いげ太さん
http://twitter.com/igeta

いげ太さんのブログ
http://igeta.cocolog-nifty.com/blog/

実践F#本のハッシュタグ
http://twitter.com/#search?q=%23PracticalFS

実践 F# メモ

// 関数はファーストクラスの値
// ファーストクラスの値は 数値や文字列のような基本的な値とほとんど同列に扱うことができる。

// 数字は1や23のように数字の羅列をそのまま書けば
// 文字列は"foo"のようにダブルクォーテーションでくくると値そのものを作り出すことができる
// このようなものをリテラル表現 (literal representation)と言う。

// ファーストクラスの値はリテラル表現を持つ。

// 関数はfun式で作ることができ、これを関数リテラルと見なすことができる。
// fun式は、ラムダ式や匿名関数とも呼ばれる。

// 関数ではなただの値とは、ゼロ個の引数をもつ関数である。
let num = 123;;
// 関数は1個以上の引数をもつ関数である。
let mul2 c = c * 2;;
mul2 10;;
let ave a b = (a + b) / 2;;
ave 10 20 ;;
10 |> ave 20;;
(10, 20) ||> ave;;

// カリー化関数
let mul2 c d = (c * 2 , d * 2);;
mul2 10 30;;
(10,20) ||> mul2 ||> mul2 ||> printfn "%d %d";;

// 関数束縛と、関数リテラルの変数束縛について
// 関数束縛とは、引数=式の形に、(mul2という)関数の名札を結びつけたもの。
let mul2 c = c * 2;;
// 関数リテラルの変数束縛とは、(fun c -> c*3 という)関数リテラルに、mul3という変数の名札を結びつけたもの
let mul3 = fun c -> c * 3;;

// 関数リテラルが変数束縛されている。
let f = (fun x -> x * 3.14) ;
f 2.;;
// 評価後の値を変数束縛
let f = (fun x -> x * 3.14) 2.;;
// このように良く読まないと関数なのかどうかがわからないので
// 素直に関数束縛を使ったほうがおすすめ。
let f x = x * 3.14;;
f 2.;;

// 関数は値だから、ローカル変数の定義の代わりに関数も定義できる。
let mul4 n = let mul2 m = m * 2 in mul2 (mul2 n);;
mul4 10 |> printfn "%d";;

// 末尾再帰の途中経過をprintf
let rec sum s n =
printfn "sum (%d + %d) (%d - %d)" s n n 1
// printfn "sum %d %d " (s+n) (n-1)
(s+n, n-1) ||> printfn "sum %d %d"
if n > 0 then
sum (s + n) (n - 1)
else
s
;;
sum 0 5 |> printfn "%d"

// 普通の再帰の途中をprintf
let rec f n = if n > 0L then printf "(%d + " n; let m = n + (f (n-1L)) in printf ")"; m else let m = 0L in printf "%d" m; m;;
f 5L |> printfn "%d";;




プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示