2017-10-01 4 views
28

は、私は(いくつかの部分が欠けている)このような関数宣言を発見しましたか?ガード構文のコンマは何をしますか?コンマはここ</p> <pre><code>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 </code></pre> <p>何をするん:私が読んでいるコードベースで

(のみボーナスとして、誰かが容易にこれを知っている場合:?。第一原理からのHaskellプログラミングに言及したこの構文は次のとおりです、そうであれば、どこ私はそれについて読んで覚えていないように)

+3

(...私は個人的に本当にこの拡張機能を嫌い、と私はそれが公式の仕様にそれを作ったが、そこに我々は少しショックを受けてる)私はそれが論理的にequivalenさを推測してますか?しかし、私は想像することができます、他のhaskellの初心者は同じ質問をするでしょう、したがって、私はstackoverflow上の質問としてこれを高めるために、良いと思った。 – Krom

+0

あなたが答えを知っていても、この質問を投稿すると良いでしょう(おそらく答えがあればそれも一緒です)。 –

+0

更新[wiki](https://wiki.haskell.org/Keywords#.2C)。 –

答えて

27

ガードがHaskell 2010 section 3.13, Case Expressions に記載されている(そのセクションは、ケース式ではなく、トップレベルの宣言についてであるが、おそらく意味は同じ):

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

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

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

ハスケルのトリビアとしてこの機能を説明していますが、ガースのコンマは珍しいです(少なくとも私の経験では、少なくとも)、ハスケルを書く(あるいは、ほとんどの場合、読んで)必要はありません。私はハスケルプログラミング第一原理からその理由のためにそれを省略すると思われる。

+3

あなたは定義を引用しましたが、重要な部分を見落としたようです: "**ガードによって導入されたバインディングは、以下のガード**の対象範囲に含まれています**"。すべてのカンマを '&&'で置き換えると、これはもちろん不可能です。たとえば、 'case()of {()| ({}の '' case() 'を使って '' x' - > 1 - > x ' x < - 1 && x == 1 - > True} 'となります。元の質問で尋ねられたコードには、この機能の使用も含まれています。 – amalloy

+1

@amalloy確かに。パターンが 'p < - e'をガードするか、' let x = e'が関与するとき、この機能は重複しません。ガードがブール式のみを使用する場合、コンマは実際には '&& 'で置き換えることができます。可能であれば、慣用的なHaskellが '&&'を使っていると思います。 – chi

+0

ありがとう、はい私はかなり不注意でした。適切な修正を行います。 –

2

この構文はHaskell '98では有効ではありません。これはHaskell 2010の言語仕様に追加されました。これは "パターンガード"言語拡張の一部です。この中

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

本当有用性は、ガード句内のパターンマッチにあなたをできるようにしてあります。構文上の変更には、カンマを使用していくつかのブール条件をANDで結合できるという副作用もあります。

関連する問題

 関連する問題