反駁不可パターン
irrefutable pattern
先にとりあえず「変数の束縛」に成功させておき,その後改めて評価を行う
Pattern Matchingを非正格評価しようぜ、というもの
遅延評価におけるPattern Matchingのときに問題になる
なんでこういう話が出てくるか
パターンマッチと遅延評価を組み合わせると、どういう順序で簡約されるかによって、パターンのマッチングに失敗することがある
失敗する例
code:hs
two = const 2 -- two :: Int -> Int
(\(x,y) -> two y) (100,100) -- 成功する例
(\(x,y) -> two y) undefined -- error !!
twoは引数に何が来ても2を返す関数
3行目では、タプルにundefinedがマッチしない
yは何でもいいので2`と返ってきても良さそうだが、マッチしないのでerrorになる
つまり、パターンの照合が早すぎる
(x, y)にundefinedをマッチできないので怒っている
code:簡約手順
(\(x,y) -> two y) undefined
→ \undefined -> two y -- こうできないのでエラー!
→ two undefined -- ここで、問題ないのでエラーさせたくない!
→ 2
これを解決する
3(+1)種類ある ref
asパターン
@
code:ex.hs
f s@(x:xs) = x:s
以下の2つを同時に使える感じ
code:hs
f s = ...
f (x:xs) = ...
これって言うほど反駁不可パターンか?
遅延パターン
ワイルドカードパターン
_を使う
code:hs
// これはエラーにならない
(\_ -> two y) undefined
寧ろこれは、普通の変数の特殊版に見えるmrsekut.icon
普通の変数
code:hs
// これはエラーにならない
(\y -> two y) undefined
ユースケース
この記事の「clientが一連の要求(request)を送り,~」のところから
相互再帰する関数reqsとrepsを使用する際に、上述の問題が生じるので、遅延パターンを用いて楽に回避する
可反駁パターン
refutable pattern
照合が成功しないことがある
e.f. contrived
#??
「照合が成功する」ってどういう意味? ref
日本語が指している意味がわからない
この記事普通に訳がおかしいなmrsekut.icon
asパターン失敗することある区内?
code:hs
Prelude> (\ v@(x,y) -> twelve v) undefined
*** Exception: Prelude.undefined
これは失敗ではない?
「反駁」ってそもそもなに?
反駁不可っって聞くと「〇〇ができない」って思えるけど、実際は「△△ができる」んだよなmrsekut.icon
参考
第8回 遅延評価の仕組み(3ページ目) | 日経クロステック(xTECH)
A Gentle Introduction to Haskell: Patterns
https://www.sampou.org/haskell/tutorial-j/patterns.html
https://or1ko.hatenablog.com/entry/20081212/1229107593
https://stackoverflow.com/questions/15181610/why-does-adding-a-tilde-in-front-of-a-pattern-match-slow-my-function-down/15181890