16

if ... then ... else ...Haskellに言語/DSLを埋め込んでいるので、キーワードを削除したいと思います。ifthenそしてelse多くのドメインで多くの意味を伝えます。言語/ドメインの性質を反映するようにそれらを再定義(または未定義のまま)できれば素晴らしいと思います。

Googleとstackoverflowで検索しましたが、何も見つかりませんでした。if ... then ... else ...( Haskellにキーワードとして含まれている理由についての古いスレッドを見つけました。)

私のIDEはLeksahにあり、キーワードを削除できる場合は、キーワードをif ... then ... else ...通常のフォント/色/太字に戻す設定があると便利です。


if'forなどの命名規則をすでに試しましifた。特に、とを定義したい場合は、とを定義する必要があり、代わりに、またはとを定義する必要がある場合は、それほど気分が良くありません。両方の存在とも混乱を招く可能性があります。(DSLのユーザーはHaskellプログラマーであるため、私の状況では混乱はそれほど深刻な問題ではありませんが、他の状況でも役立つと思います)。ifif'if'if''if1if2if'if


これまでの回答の要約:

  • RebindableSyntaxGHCの拡張機能を使用します。キーワードを削除するほど一般的ではありません。Haskellのif-then-elseの構文は保持されます。(フレリッヒ・ラーベ)
  • 回避策:を使用して、非常によく似た単語/名前を使用しますdata Conditional b a = If b (Then a) (Else a)(一部のコンテキストでのみ適用可能)。(CAマッキャン)

が比較的新しい機能である場合RebindableSyntax、少なくとも次のバージョンのGHCまでは、より一般的な方法を見つけることはほとんどありません。

4

3 に答える 3

31

GHCのRebindableSyntax拡張によりif ... then ... else、独自のバージョンで式をオーバーロードできます。特に、ifThenElse関数は別の意味を定義するために使用されます。if e1 then e2 else e3"を意味しifThenElse e1 e2 e3ます。

いくつかの例を含む、この機能の適切な説明については、ブログ記事Rebindable if..then..else expressionsを参照してください。

于 2011-08-09T12:42:21.480 に答える
11

既存のキーワードを削除することはできません。指摘されたように、RebindableSyntaxを使用できますが、それでは希望どおりの結果が得られない可能性があります。

キーワードの削除に近づく唯一のことは、CPPオプションをオンにして、次のようなことを行うことです。

#define if if_
#define then then_
#define else else_

その後、プリプロセッサはif / then/elseをif_/then_/else_に展開します。

于 2011-08-09T13:01:16.253 に答える
0

どうですか:

cond True  t _ = t
cond False _ f = f
于 2011-08-09T12:51:32.360 に答える