2

私はいくつかの機能要素を特徴とするカスタム言語を書いています。私がどこかで立ち往生しているとき、私は通常、Haskellがそれをどのように行うかをチェックします。しかし今回は、Haskellに与える例を考えると、問題は少し複雑です。

これがその方法です。

次の行があるとしましょう

a . b

Haskellで。明らかに、aとbの2つの関数を構成しています。しかし、関数aが別の2つの関数をパラメーターとして受け取った場合はどうなるでしょうか。での動作を停止しているのは何ですか。とb?角かっこで囲むことができますが、式は関数、接頭辞1に評価され、接頭辞関数は中置関数よりも優先されるため、違いはありません。

もし、するなら

(+) 2 3 * 5

たとえば、17ではなく25を出力します。

基本的に私が求めているのは、前のプレフィックス関数の前に中置関数を動作させたい場合、Haskellはどのメカニズムを使用するのかということです。

それで。「a」がパラメータとして2つの関数をとる関数である場合。Haskellが解釈するのをどのように止めますか

a . b

「。とbを関数aに適用する」と解釈し、「関数aとbを合成する」と解釈します。

4

4 に答える 4

11

演算子の周りにパレンを配置しない場合、それは常に中置として解析されます。つまり、オペランドではなく、演算子として。
たとえば、を持っている場合f g ? i j、周り?に親はないので、すべてがへの呼び出しです(?)(として解析され(f g) ? (i j)、と同等(?) (f g) (i j))。

于 2013-02-08T12:28:55.410 に答える
4

あなたが探しているのは固定宣言だと思います(Haskellレポートを参照)。

基本的に、中置関数の演算子の優先順位を宣言できます。

たとえば、

infixl 7 *
infixl 6 +

つまり、+*は両方とも結合性の中置演算子のままです。 *優先順位7があり、優先順位+6があります。つまり、*より強くバインドし+ます。.レポートページでは、次のように定義されていることもわかります。infixr 9 .

于 2013-02-08T12:33:14.553 に答える
3

基本的に私が求めているのは、前のプレフィックス関数の前に中置関数を動作させたい場合、Haskellはどのメカニズムを使用するのかということです。

誤解を指摘するだけです。これは、純粋に式の解析方法の問題です。Haskellコンパイラは次のことを知りません(または:知る必要はありません)。

f . g

f、g、(。)は関数などです。

それは逆になります:

  1. パーサーはf . g (または構文的に同等の:)をi + j参照します。
  2. これをApp (App (.) f) g、字句規則と構文規則に従うようなものとして渡します。
  3. その場合にのみ、タイプチェッカーがそれを検出すると、それは関数である必要があるApp a bと結論付けます。a
于 2013-02-08T13:51:41.517 に答える
1
(+) 2 3 * 5

として解析されます

((+) 2 3) * 5

したがって

(2 + 3) * 5

つまり、関数アプリケーション(のような(+) 2 3)は、のような中置記法の関数の前に、最初に評価されるため*です。

于 2013-02-08T12:09:40.350 に答える