Imaginantia

思ったことを書きます

条件分岐と関数合成 / 例

条件分岐と関数合成 - Imaginantia

f = do
  b ← do
    a = g()
    if a.valid
      then B(a, true)
      else do
        a = h()
        B(a, false)
  return C(b)

近いが遠ざかった・・・ これは結局無名関数の即時実行ができるみたいな気持ち

C f(){
  B b = [(g,true), (h,false)].firstJust((fu,fl)=>{
    A a = fu();
    a.valid ? Just(B(a,fl)) : Nothing
  });
  return C(b);
}

なるほど?あえて関数型スタイルにするというのもまぁ

C f(){
  A a = g();
  if(a.valid) goto[then](B(a,true));
  a = h();
  goto[then](B(a,false));
then(b):
  return C(b);
}

わりとありだとおもうんですけどねー。安全性の確保とかの問題はある。ただ2つの道が同等に扱われつながるというのがわかりにくいかなぁ。

f:id:phi16_ind:20171122030807p:plain

やりたいことはこういうことだとおもうんですよね。でもこれは並列すぎる。うーん。phi関数周りの気持ちだとこうなってしまうなぁ


結局直列と並列を合成する、という気持ちかもしれない。