3

モナド計算を接頭辞表記で書き直す方法を見つけようとしています(実際の実用的な目標ではなく、研究のためだけです)が、あるラムダが別のラムダのパラメータを認識しないという問題

与えられた実際の例

*Main> [1, 3, 4] >>= \x -> [x + 1, x - 1] >>= \y -> return (y*x)
[2,0,12,6,20,12]

書き換えられたものは、他のラムダのパラメーターが表示されないというエラーを示しています

*Main> (>>=) ( (>>=)  [1, 3, 4] (\x -> [x + 1, x - 1]) ) (\y -> return (y*x))
<interactive>:133:68: Not in scope: `x'

しかし、それを使用しない最後のものを作成すると(xをyに置き換えることにより)、計算が機能し始めます

*Main> (>>=) ( (>>=)  [1, 3, 4] (\x -> [x + 1, x - 1]) ) (\y -> return (y*y))
[4,0,16,4,25,9]

接頭辞表記の完全な書き換えは技術的に可能ですか?それとも、他のラムダ パラメータにアクセスするこのプロパティは、中置表記だけに限定されているのでしょうか?

4

1 に答える 1

8

問題は、優先順位が少し間違っていることです。Haskell Precedence: Lambda and operatorも参照してください。

ラムダ式の本体は、可能な限り右に拡張されます。次に、例を次のように括弧で囲みます。

[1, 3, 4] >>= (\x -> [x + 1, x - 1] >>= (\y -> return (y*x)))

それを接頭辞形式にすると、

(>>=) [1, 3, 4] (\x -> (>>=) [x + 1, x - 1] (\y -> return (y*x)))

xの本体内に表示されるようになりました\y -> ...

于 2013-03-17T07:38:03.450 に答える