2. 変数いろいろ
let n = 1 // 数値リテラル var n = 1; // 数値リテラル
let s = "123" // 文字列リテラル var s = "123"; // 文字列リテラル
let li = [ 1; 2; 3; 4; 5] // リストリテラル // リストリテラル?
var li = new List<int> { 1, 2, 3, 4, 5 };
// list comprehension
let li2 = // リスト内包表記...?
[ for x in 1..20 do var li2 =
if x % 2 = 0 then Enum erable.Range(1, 20)
yield x ] .W here(x => x % 2 == 0).ToList();
// Sequence = Enum elable<T> // もうLinqで
let sq = var sq =
seq { for x in 1..10 - > x, x*x, x*x*x } from x in Enumerable.Range(1, 10)
select new { X=x, XX=x*x, XXX=x*x*x };
3. 関数(メソッド)いろいろ
// 普通の // 普通の
let func x = x + 10 static int Func(int x) { return x + 10; }
// 繰り返し // 繰り返し
let factorial n = static int Factorial(int n) {
let rec loop accum n = var result = 1;
if n < 1 then accum for (int i = 1; i <= n; i++)
else loop (accum * n) (n - 1) result *= i;
loop 1 n return result;
}
// 高階関数
let rec fold proc init li = // 高階関数
m atch li w ith static TResult Fold<TSource, TResult>(
| [] - > init Func<TResult, TSource, TResult> proc,
| x::xs - > fold proc (proc init x) xs TResult init,
List<TSource> li) {
foreach (TSource e in li)
init = proc(init, e);
return init;
}
4. ライブラリの高階関数
// 要素番号と要素を列挙する // 要素番号と要素を列挙する
Seq.iteri (printfn "%d:%d") [1..10] var index = 0;
foreach (var x in Enum erable.Range(1,
// 要素に関数を適用した結果をSeqにして返す 10).Select( x => new { i=index++, x=x }))
let a = Seq.m (fun x - > x * x) [1..10]
ap Console.W riteLine(x.ToString());
// 条件を満たす要素のみのSeqを返す // 要素に関数を適用した結果をEnum rable<T>に
let b = Seq.filter (fun x - > x % 2 = 0) [1..10] して返す
var a = from x in Enumerable.Range(1, 10)
// グルーピング select x * x;
let c = Seq.groupBy (fun x - > x % 3) [1..20]
// 条件を満たす要素のみのSeqを返す
var b = from x in Enumerable.Range(1, 10)
where x % 2 == 0
select x;
// グルーピング
var c = Enum erable.Range(1, 20).GroupBy(x
=> x % 3);
5. 関数を返す高階関数
// メモイズ // メモイズ
let m oize func =
em static Func<T, TResult> M oize<T,
em
let cach = ref M ap.em pty TResult>(Func<T, TResult> func)
fun n - > {
m atch M ap.tryFind n !cach with var cach = new Dictionary<T, TResult>();
| Som v - > v
e return (T n) => {
| None - > var v = default(TResult);
let tem = func n
p if (cach.TryGetValue(n, out v))
cach := M ap.add n tem !cach
p return v;
tem p else
{
var tem = func(n);
p
cach.Add(n, temp);
return temp;
}
};
}
7. 関数を整理してみる
model type
action unit -> unit
comparison function Type -> Type -> int
callback Type -> unit
delayed computation unit -> Type
transformer Type1 -> Type2
sink Type -> unit
visitor accumulating function Type1 -> Type2 -> Type2
8. 高階関数って結局何ができ
る?
「処理」と「制御」と「構造」を
簡単 に分離できる
↓
IoC パターンの促進