La terminología puede ser un poco confusa, pero sí, hay dos idiomas, por ejemplo, en "Nociones de cómputos como mónadas" de Moggi (enlace gratuito aquí: https://core.ac.uk/download/pdf/21173011.pdf ).
En ese documento, los lenguajes se denominan λm l , el metalenguaje, y λp l el "lenguaje de programación". Creo que
λp l desempeña el papel del cálculo lambda computacional, pero puedo estar equivocado. Un aspecto confuso es que ambos lenguajes tienen un constructor de tipo explícito T representa la mónada, pero se usan de manera diferente.
λm l es un lenguaje "puro" con una mónadaT , es decir, toda manipulación de la mónada es explícita en los tipos y el tipo de funciónτ1→ τ2 es el tipo de funciones puras. Observe la regla de vinculación (de la figura 3 en la página 9):
x : τ⊢m lmi1: Tτ1X1: τ1⊢m lmi2: Tτ2x : τ⊢m ll e tTX1⇐ e1i n e2: Tτ2
mi1 ymi2 se escriben explícitamente como términos deTτ1, Tτ2
para marcar que son efectivos. Cada expresión efectiva es realmente un término puro con tipo monádico. Esto es similar a cómo programamos con mónadas en Haskell donde Haskell desempeña el papel del metalenguaje y la mónada codifica los efectos, pero realmente siempre estamos manipulando términos "puros" (pongo "puro" entre comillas ya que Haskell tiene sus propios efectos de divergencia y error).
x : τ⊢m le : τ′[ τ] → [ τ′]
λp lx : τ⊢p le : τ′τ′τ⇀ τ′
x : τ⊢p lmi1: τ1X1: τ1⊢p lmi2: τ2x : τ⊢p ll e t x1⇐ e1i n e2: τ2
mi2x : τ⊢p le : τ′[ τ] → T[ τ′]
λpagslTTunaunit -> a
->