web-dev-qa-db-ja.com

ガード構文のコンマは何をしますか?

私が読んでいるコードベースで、次のような関数宣言を見つけました(一部が欠落しています):

filepathNormalise :: BS.ByteString -> BS.ByteString
filepathNormalise xs
    | isWindows, Just (a,xs) <- BS.uncons xs, sep a, Just (b,_) <- BS.uncons xs, sep b
    = '/' `BS.cons` f xs

ここでコンマは何をしますか?

(ボーナスとしてのみ、誰かがこれをすぐに知っている場合:この構文は第一原理からのHaskellプログラミングで言及されていますか?もしそうなら、どこですか?私はそれについて読んだことを覚えていません。)

30
typetetris

ガードについては Haskell 2010セクション3.13、ケース式 (このセクションはケース式に関するものであり、トップレベルの宣言ではありません。しかし、おそらくセマンティクスは同じです):

guards  →  | guard1, …, guardn      (n ≥ 1)
guardpat <- infixexp         (pattern guard)
        |  let decls               (local declaration)
        |  infixexp                (boolean guard)

ガードされた式ごとに、コンマで区切られたガードが左から右に順番に試行されます。それらすべてが成功した場合、対応する式は、ガードによって導入されたバインディングで拡張された環境で評価されます。つまり、ガードによって(let句またはパターンガードを使用して)導入されるバインディングは、次のガードと対応する式のスコープ内にあります。いずれかのガードが失敗した場合、このガードされた式は失敗し、次のガードされた式が試行されます。

単純なケースでは、コンマはブールおよびと同様の役割を果たします。ただし、コンマは、各ガードが後続のガードによって使用される新しいバインディングを導入できるという点でより強力です(左から右に進みます)。

警備員のコンマは(少なくとも私の経験では)十分に珍しいので、この機能をHaskellの雑学クイズとして説明します-Haskellを書く(またはほとんどの場合読む)のにまったく必要ありません。 第一原理からのHaskellプログラミングはその理由でそれを省略しているのではないかと思います。

28
Chris Martin

この構文はHaskell'98では合法ではありません。これはHaskell2010の言語仕様に追加されました。これは「パターンガード」言語拡張の一部です。

https://prime.haskell.org/wiki/PatternGuards

これにおけるrealの有用性は、ガード句内でパターンマッチングを可能にすることです。構文の変更には、コンマを使用していくつかのブール項をANDすることができるという副作用もあります。

(私は個人的にこの拡張機能が本当に嫌いで、公式仕様に組み込まれたことに少しショックを受けましたが、そこにあります...)

2