このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

総称高階関数計算の練習:解答編

「総称高階関数計算の練習:積モナドの乗法を書き下す」にて:

次の定義を総称高階関数計算の記法に翻訳しましょう。

  • τ := (ν*L)・(EE*μ)・(E*γ*L)
  • τ := (E*μ)・(ν*LL)・(E*γ*L)

いや、これは宿題にしよう、っと。計算練習にやってみてください。解答はたぶん来週。

このテのエントリーはまったく人気がなくて、この計算練習は誰一人やってないような気がするが、、、まー、いいや。

以下で、「=」は普通の等号で、「≒」は「翻訳をしたよ」という意味。(ν*L)・(EE*μ)・(E*γ*L) を、総称高階関数計算の記法で書き下します。まず、3つのパーツを別々に計算しておきます。

   (E*γ*L)X
 = [E*(γ*L)]X
 = E(γ*L)X
 = E(γLX)
≒ e_map(combinations[List X])

(EE*μ)X = EE(μX) ≒ e_map(e_map(l_flatten[X]))
(ν*L)X = νLX ≒ e_flatten[List X]

では、全体を計算します。「#」は、コメントじゃなくて反図式順の関数結合です。

   [(ν*L)・(EE*μ)・(E*γ*L)]X
 = (ν*L)X(EE*μ)X(E*γ*L)X
≒ e_flatten[List X] # 
   e_map(e_map(l_flatten[X])) # 
   e_map(combinations[List X])

マップ関数はカリー化されているとして(そのほうが計算が簡単なので)、引数elelを渡してみます。

   [e_flatten[List X] # e_map(e_map(l_flatten[X]))  # e_map(combinations[List X])](elel)
 = [e_flatten[List X] # e_map(e_map(l_flatten[X]))]
    (e_map(combinations[List X])(elel))
 = e_flatten[List X](
     e_map(e_map(l_flatten[X]))(e_map(combinations[List X])(elel))
   )

総称の型パラメータを省略して、一部のマップ関数を2引数にすると、次の形になります。

  • e_flatten(e_map(e_map(l_flatten), e_map(combinations, elel)))

τ := (E*μ)・(ν*LL)・(E*γ*L) のほうも同様にやってみてください(って、誰もやらないか ^^;)。