鉄道指向プログラミング
Railway oriented programming
functional mini patterns
HaskellでいうEither型、並びにEitherモナドを使ったプログラミングのことをこの記事がそう呼んでいる
Eitherモナドを知っている人からすると復習になる
Either型やEitherモナドのことを知らない人が読むと学びがありそう
Monadを知らない人に対する具体例から理解するモナドの解説としても有用な気がする
Monadという単語を一切使わずに具体例から徐々に抽象化していく感じで解説が進むのが良い
HaskellやPureScriptやF#などの演算子オーバーロードがある言語で試してみるとより良さそう
TypeScriptではそこまでキレイに書けない気がする
同じようなことはできる
Haskellでかいてみる ref
この部分を同じレイアウトで書こうとするとこんな感じになる
>>>はControl.Arrowのもの
逆向きの関数合成として使っている
code:hs
usecase :: Request -> Either Text Request
usecase =
validate1
=> validate2
=> validate3
>> fmap coanonicalizeEmail
code:hs
-- こう書いても同じ
usecase =
validate1
=> validate2
=> validate3
=> Right . coanonicalizeEmail
ちなみにこう書くのは間違い
code:hs
usecase :: Request -> Either Text Request
usecase = do
validate1
validate2
validate3
これは3つのvalidateを独立で行っている
今回のケースではこれでも問題ない
もしvalidate1のRightの結果を返す時に何かしら文字列を操作された場合は結果が変わる
例えばRight $ toLower rと書いてたりすると変わる
参考
How to design and code a complete program · F# for Fun and Profit
日本語訳
Railway oriented programming: Carbonated edition · F# for Fun and Profit
日本語訳
最後の方、Arrowの話をしているみたいになっているなmrsekut.icon
https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/railway-oriented-programming-carbonated.html
/mrsekut-book-97816805025/211 (Chaining Result-Generating Functions)