Haskellのpattern bindingについて
背景
テスト環境はGHC7.8.3です。
以下の情報は4 Declarations and Bindingsを参照しています。
Haskellにはpattern bindingとfunction bindingという2種類の束縛があります。この内、pattern bindingは
p | gs1 = e1
| gs2 = e2
…
| gsm = em
where { decls }
という一般形を持ちます。またsimple pattern bindingとはp = e
の形のpattern bindingのことです。
ところでMonomorphism Restrictionという仕組みがあります。これは大雑把に言うと、型変数の一部を具体的な型で置き換えてしまうものです。文書にはfunction bindingと型シグネチャを伴うsimple pattern bindingのみMRの影響を受けないと書かれています。またnon-simple pattern bindingの場合、型シグネチャのあるなしに関わらず制約のある型変数を単相的にしてしまうとも書かれています(従ってMRにより具体的な型を持つ)。
そこでこの仕様をテストすることにしました。non-simple pattern bindingを
(一般形) - (simple pattern binding) = ガードとwhere付きのpattern binding
であると考え、次のようなコードを試してみました。
h :: Num a => [a] -> a
h | guard = sum
| otherwise = sum
where guard = False
型シグネチャを付けたり外したりしたのですが、simple pattern bindingと同じ振舞いをするようです。
一方、Stack Overflowの回答では(x:xs) = f something
や(f, g) = ((+), (-))
をnon-simple pattern bindingとしています。左辺が単一の変数名からなる時、simple pattern bindingであるとの記述もあります。
私の捉え方だと、これはsimple pattern bindingです(p
を任意のパターンだと読んだこと、及び一般形だろうがsimpleだろうが左辺は同じメタ変数p
を使って表現されていることから)。ただ、後者のf
とg
にNum a => a -> a -> a
という型シグネチャをつけてロードしたところ、エラーを吐いたのでMRの仕様と整合していると言えます。
質問
私の考え方のどこが間違っているのでしょうか、またnon-simple pattern bindingの形はどんなものでしょうか。