Haskellに単純なライブラリ関数として定義するのではなく、組み込みの「if / then / else」があるのはなぜですか?


25

なぜHaskellには、単純なライブラリ関数ではなくif/then/elseBoolタイプに依存する組み込みがありますか?といった

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
私は、agdaにあるようなmixfix関数なしでは手に入らないif / then / else構文を明示的に望んでいたと思います。あなたが参照する関数は三元として構造化されており、自分で実装することができますが、if / then / elseシュガー(おそらくケース上のシュガー)を与えたと思われますが、それは無害だからです。ここで私をバックアップするため、コメントでこれを書いています。
ジミー・ホッファ

10
これはほとんどの読者にとって明らかかもしれませんが、関数としてîf/ then / elseを使用することは、怠zyでは合理的ですが、熱心な言語(スキームやsmlなど)では良い解決策ではないことを指摘したいと思います。 Haskellのような言語。
ジョルジオ

回答:


24

それは素敵なの砂糖のために純粋だifthenelseキーワード。実際、GHC(RebindableSyntax拡張機能を有効にした場合)ifThenElseは、スコープ内の関数を呼び出すだけで構文をデシュガーします。


6

大した問題ではありません...私にとっては、/ then / elseが最近ではあまり使われないように見えます。if .. then .. elseのパターンガードinstadを書いていることに気づきました。

ただし、構文の観点からは、

if expr1 then expr2 else expr3

だからあなたは書くことができます

if foo a then bar b else baz c

の代わりに

if (foo a) (bar b) (baz c)

私には少しLISPに見えます。

セマンティック分析とコード生成のために、効率的なマシンコードに簡単にコンパイルできるこの構成があれば便利です。(未評価の)パラメータをすべて渡す必要がある関数呼び出しとは対照的に、到達しないブランチのサンクを作成する部分をコードでスキップできることに注意してください。ただし、サンクを作成するには時間(およびメモリ、後で再生する必要があります)もかかります。これを有効にするには、どこでもif関数をインライン化する必要があります。


3
インライン化は実際の問題ではないと思います。私の理解では、GHCは既にHaskellの一般的なパターンであるため、小さな関数のインライン化は非常に優れているということです。
ティコンジェルビス

1
@TikhonJelvisもちろんですが、if / then / elseを使用すると、常にインライン化する必要がある特別な関数は必要ありません。インラインパスも必要ありませんが、それでも適切なコードを生成できます。すべての世界がGHCであるわけではありません。
インゴ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.