19809
# 背景

テスト環境はGHC7.8.3です。  
以下の情報は[4 Declarations and
Bindings](https://www.haskell.org/onlinereport/haskell2010/haskellch4.html "4
Declarations and Bindings")を参照しています。

Haskellにはpattern bindingとfunction bindingという２種類の束縛があります。この内、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の回答](https://stackoverflow.com/questions/32496864/what-is-
the-monomorphism-restriction)では`(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の形はどんなものでしょうか。
CC BY-SA 3.0
2015-12-09T08:52:51.427
19801
2015-12-09T10:14:06.480
2017-05-23T12:38:56.467
-1
13199
question
haskell
Haskellのpattern bindingについて
一応、自己解決しました。  
4.5.5のはじめに

> a simple pattern binding is a pattern binding in which the pattern consists
> of only a single variable

なる記述がありました。  
従って、`(一般形) - (simple pattern binding) = ガードとwhere付きのpattern
binding`は間違いです。`h`もsimple pattern bindingです。また`(x:xs) = f something`や`(f, g) =
((+), (-))`がnon-simple pattern bindingというのも正しいです。

それでも4.4.3.2 Pattern bindingsの書き方とは矛盾しているような気がしますが・・・。
CC BY-SA 3.0
2015-12-09T10:14:06.480
19809
2015-12-09T10:14:06.480
13199
19801
answer