Slide 1

Slide 1 text

Nextbeat Tech Bar︓第五回関数型プログラミング(仮)の会 C#で関数型プログラミング

Slide 2

Slide 2 text

/r-hanaoka @dora56 @karyu721 l 花岡 ⿓ l 株式会社 オルターブース l Azure, GitHub 導⼊⽀援 l 趣味: 読書・ゲーム ⾃⼰紹介

Slide 3

Slide 3 text

話すこと、話さないこと l 話すこと l C#でできる基本的な関数型プログラミング要素 l 話さないこと l F#の話 l C#の応⽤的な関数プログラミング

Slide 4

Slide 4 text

概要 l C#について l C#の関数型プログラミングの要素 l デリゲート型 l LINQ l record型 l パターンマッチング

Slide 5

Slide 5 text

C#を知らない⼈のための概要 Microsoft製のプログラミング⾔語 .NETプラットフォームで提供されているプログラミング⾔語の1つ ※他にはF#やVisual Basicがある クロスプラットフォーム Windows, Linux, Macなどでプログラミング可能 マルチパラダイム ⼿続き型、オブジェクト指向、関数型などをサポート C#について

Slide 6

Slide 6 text

デリゲート(delegate: 代表、移譲、委託) delegate int AddDelegate(int x, int y); static int StaticAdd(int x, int y) => x + y; static void Main() { var addDelegate = StaticAdd; var reslut = addDelegate(1, 2); Console.WriteLine(reslut); // output: 3 } C#の関数型プログラミングの要素 メソッドを参照する型 処理を他のメソッドに移譲できる CやC++で⾔うと関数ポインタ 実際の値が必要になると実⾏(遅延評価) delegateを複数登録できる

Slide 7

Slide 7 text

デリゲートの派⽣(Action, Func) static Action PrintAction = x => Console.WriteLine(x); PrintAction(“Hello World”); // output: Hello World public delegate void Action(T obj); // C#での定義 C#の関数型プログラミングの要素 Action型 値を返さないdelegate 引数は0~16まで対応 static Func IntToStrFunc = x => x.ToString(); Console.WriteLine(IntToStrFunc(1)); // output: 1 public delegate TResult Func(T arg); // 定義 Func型 値を返すdelegate 引数は0~16まで対応

Slide 8

Slide 8 text

デリゲートの発展 var add = (int x) => (int y) => x + y; var add10 = add(10); var ansA = add10(10); var ansB = add10(-10); var ansC = add(10)(90); Console.WriteLine(ansA); // 20 Console.WriteLine(ansB); // 0 Console.WriteLine(ansC); // 100 var add1 = add.Partial(10); // 動作しない add1(10); C#の関数型プログラミングの要素 ラムダ式 デリゲートを簡略化 カリー化と部分適⽤ カリー化も簡単に書ける 部分適応はサポートされていないので、 拡張メソッドという機能を使って実装する

Slide 9

Slide 9 text

統合⾔語クエリ(LINQ: Language-Integrated Query) var result = Enumerable.Range(1, 5) .Select(x => x * x) // 1, 4, 9, 16, 25 .Where(x => x > 10) // 16, 25 .Sum(); Console.WriteLine(result); // output: 29 C#の関数型プログラミングの要素 LINQとは 配列やコレクションを操作できる機 能 SQLのような感覚でクエリを 書ける List> input = [[1, 2, 3], [4, 5, 6]]; var result = input.SelectMany(x => x); var output = string.Join(Environment.NewLine, result); Console.WriteLine(output); // output: 1, 2, 3, 4, 5, 6 SelectManyでflatmap相当の処理 が可能

Slide 10

Slide 10 text

record record Person(string FirstName, string LastName); static void Main() { Person person = new("Nancy", "Davolio"); Console.WriteLine(person.FirstName); // output: Nancy person.FirstName = "Robert"; // error: 読み取り専⽤ var person2 = person with { FirstName = "Robert" }; Console.WriteLine(person.FirstName); // output: Nancy Console.WriteLine(person2.FirstName); // output: Robert Console.WriteLine(person == person2); // output: False person2 = person with { }; Console.WriteLine(person == person2); // output: True } C#の関数型プログラミングの要素 特徴 不変プロパティを持つ参照型の クラスの修飾⼦ なんらかの値を変更する場合は with 式を使⽤ 同じ型で同じ値を持つなら等しい

Slide 11

Slide 11 text

パターンマッチング public record Person(string Name, int Age); public string CallAdult(Person person) => person switch { { Age: > 20 } => $"{person.Name} is an adult", _ => $"{person.Name} is not an adult " }; C#の関数型プログラミングの要素 できること 式を評価してアクションを実⾏ “_”で⼀致しなかった評価を処理 (破棄パターン) public Func Dispatcher(string command) => command switch { "add" => Add, "sub" => Sub, "mul" => Mul, "div" => Div, _ => throw new ArgumentException("Invalid command") }; 応⽤︖ 関数を返すパターンマッチングで いろいろできそう

Slide 12

Slide 12 text

もっと知りたい⽅へ 最後に

Slide 13

Slide 13 text