名古屋Ruby会議04 登壇と、資料準備の舞台裏

2019-06-09 イベント

2019/06/08に開催された名古屋Ruby会議04で、関数型プログラミングの話をしてきました。なんでやねん、という感じですが。

大須演芸場での開催ということで、高座に登っての発表です。すごく珍しい経験でした。

立派なめくりも作っていただきました。

亭号は「片月亭」になっています。

IMG_20190608_132408.jpg (1.1 MB, orientation fixed)

こういった雰囲気に合わせ、発表資料も落語風の「マクラ→本題→サゲ」という構成にしました。

語りで補った部分が多いのですが、スライドだけでも流れは概ね伝わるかなぁと思います。

この発表について、懇親会でいろんな方からお褒めいただき大変嬉しかったです。

それと同時に、「マクラからサゲの構成をどうやって思いついたのか」という質問を何度かいただきました。

その場ではあまり細かい話をできませんでしたが、せっかくなので今回の発表をどう作っていったのか記録しておこうと思います。

Continue reading

関数型プログラミングとは結局何なのか

この記事はドワンゴ Advent Calendar 2014の14日目です。
ちなみに前日は@erukitiさんでした。
他の方は「こんなもの作ってみた!」系の記事が多いのですが、技術系の話題であれば特に縛りはないようなので、今回はひたすら文章をつらつらと綴っていきたいと思います。

ここ数年、「マルチコア時代の主流は関数型だ」とか「Javaはもう古い! 時代は関数型!」といった記事をよく見かけるようになった気がします。
大学でOCamlを学んできた自分としては嬉しい限りなのですが、なんだか関数型という言葉がバズワード的な使われ方をしている気がして、まるで「現在起こっている全ての問題を解決する銀の矢だ!」といわんばかりの雰囲気を感じるのが気になっています。
最近うちの部署でもにわかに「関数型っぽく書こう」みたいな機運が高まってることもあるので、この機に関数型プログラミングとはなにか、どのような特徴があって何に向いているのか、みたいなことをまとめてみたいと思います。

Continue reading

初心者のための関数型λカ娘入門

2014-12-09 技術書

お前たち! 今日も元気にβ簡約してるでゲソか!?
今日は参照透明な海を守る会さんの「簡約! λカ娘」シリーズについて、初めて読む際に読みやすいオススメ記事を挙げていくでゲソ。

「簡約! λカ娘」はHaskellをメインにした関数型の話題のオムニバス本で、基礎的な解説からぶっ飛んだネタ記事まで、カオスに詰めあわされているのが特徴の同人誌でゲソ。
章立てになってはいるもののオムニバスなので相互の関連はあまりなく、興味のあるところから読み進められるようになっているでゲソ。
ちなみに総集編は薄い本だけど分厚くて、500円玉の直径より分厚いでゲソ。

そんな関数型λカ娘でゲソが、章ごとにテーマや難易度がまちまちで、なおかつどこからでも読めてしまうせいで、逆にHaskell力が低いとどこから読めばいいのかわからなくなってしまう魔性の本でもあるのでゲソ。
そこで今回、とりあえずざっくり通読して「初学者が読みやすい」と感じた記事を上げて、λカ娘信者を増やしていきたい所存でゲソ。

”>ちなみに現時点で1~6巻までをまとめた簡約!? λカ娘 – 始まりの総集編は在庫切れで手に入らず、最新刊の簡約 λカ娘 巻の七はそもそも委託販売がないようでゲソ。
総集編在庫復活したみたいでゲソ!
また巻の七も委託されたでゲソ!
簡単に手に入るようになって素晴らしいじゃなイカ!

じゃあこの記事は役立たずなんじゃなイカ!?
と思われそうでゲソが、実はうちの会社の本棚にはこの2冊が我が物顔で鎮座しているのでゲソ!
そう、本棚をλカ娘本が侵略しているのでゲソ! すごくなイカ?

そんなわけで、ぶっちゃけこの記事は社内のHaskell勉強会で興味を持って「せっかくだしλカ娘本もちょっと読んでみようかー」と思った同僚向けでゲソ。
あと、もしかしたら既に購入したものの頭から読んで挫折して積ん読になってる人とかいるかもしれないし、そのうち再販されるかもしれないので、そんな時のために記事として残しておくことにするでゲソ。

本記事ではHaskellの文法事項をある程度知っているが、Haskellを使い込んではおらず、また圏論やモナドなどの理論的基礎までは踏み込んでいないような読者を想定しているでゲソ。
よって取り上げる記事も理論的な基礎固めや簡単な応用に絞っていることに留意して欲しいでゲソ。
もちろんイカで取り上げる以外にも面白いトピックが多いので、慣れてきたら色々読んでみると良いのでゲソ。
それでは、順番に挙げていくでゲソ。
あ、ちなみに巻数を指定していない場合は「始まりの総集編」の章番号を差すでゲソ。

Continue reading

鉄道指向でこころがぴょんぴょんする解説

前回鉄道指向でこころぴょんぴょんする記事を書いたところ、会社の同僚から「鉄道指向ってなんだい? わけがわからないよ。あと、この記事はどの辺がごちうさに関係あるんだい?」というありがたいコメントを頂きました。
そんなわけで、今回は前回書いたプログラムについて、鉄道指向と絡めて解説したいと思います。
なお、鉄道指向について詳しく知りたい場合は鉄道指向プログラミングの翻訳記事を読んでいただいたほうがわかりやすいかと思います。

さて、ざっくり鉄道指向について説明すると、「成功(Success)と失敗(Failure)の2種類の値を返すような関数を鉄道のスイッチに見立てて、この関数を組み合わせて広大な路線=プログラムを組み立てていく」というプログラミングスタイルです。
例えば何らかのWebアプリケーションを、以下のようなブラックボックスと考えてみましょう。

Request-Response

ApplicationからSuccessとFailureの2本の矢印が伸びていますが、これはSuccessとFailureの両方を返すわけではなく、状況に応じていずれか一方を返すという意味です。
鉄道の路線と同様、通るのはどちらか一方だけ、ということですね。
またSuccessとFailureはどちらの路線かという情報とは別に、更に詳細な情報を持つことが出来ます。
上を通る列車が、詳細な情報を荷物として載せているイメージです。

このような「SuccessとFailureのいずれかを返す型response」は、OCamlでは代数的データ型を用いて以下のように書くことが出来ます。

type ('a, 'b) response = Success of 'a | Failure of 'b

‘aがSuccessの時に保持している詳細情報の型を、’bがFailureの時に保持している詳細情報の型を、それぞれ表しています。
例えば成功した時に数値を、失敗した時に文字列を詳細情報として持つような型は

(int,string) response

という型になります。
Success(1)やFailure(“入力した数値が不正です”)などは(int,string) response型の値です。

Continue reading

第2羽 関数を愛した言語と鉄道指向に愛された言語

この記事はごちうさ住民 Advent Calendar 2014の2日目です。
あとタイトルは内容にあんまり関係ありません。

みなさん、心ぴょんぴょんしてますか?
今日は、鉄道指向を使って心ぴょんぴょんしてみたいと思います。

まずは、鉄道指向プログラミングの翻訳記事を参考に、鉄道指向で用いるResultモジュールを定義します。

type ('a, 'b) t = Success of 'a | Failure of 'b
let succeed x = Success x
let fail x = Failure x
let either successFunc failureFunc = function
  | Success s -> successFunc s
  | Failure f -> failureFunc f
let plus addS addF f1 f2 r = match f1 r, f2 r with
  | Success s1, Success s2 -> succeed @@ addS s1 s2
  | Failure f1, Success _  -> fail f1
  | Success _ , Failure f2 -> fail f2
  | Failure f1, Failure f2 -> fail @@ addF f1 f2

続いて、こころぴょんぴょんする関数を定義していきましょう。

let failOnMod n' msg n = if n mod n' =  then Failure msg else Success n
let aa     = failOnMod 3 "あぁ^~"
let kokoro = failOnMod 5 "心が"
let pyon   = failOnMod 7 "ぴょんぴょんするんじゃぁ^~"
let (&&&) = plus const (^)
let gochiusa = aa &&& kokoro &&& pyon >> either string_of_int id
 
let () = List.iter (gochiusa >> Printf.printf "%s\n") (1--105)

一部定義をすっ飛ばした関数がありますが、些細なことなのでUtil.mlのソースを見て下さいね。
では、さっくりMakeして実行してみましょう。

Continue reading