反駁不可パターン
irrefutable pattern
先にとりあえず「変数の束縛」に成功させておき,その後改めて評価を行う
なんでこういう話が出てくるか
パターンマッチと遅延評価を組み合わせると、どういう順序で簡約されるかによって、パターンのマッチングに失敗することがある
失敗する例
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
これを解決する
@
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
日本語が指している意味がわからない
この記事普通に訳がおかしいなmrsekut.icon
asパターン失敗することある区内?
code:hs
Prelude> (\ v@(x,y) -> twelve v) undefined
*** Exception: Prelude.undefined
これは失敗ではない?
「反駁」ってそもそもなに?
反駁不可っって聞くと「〇〇ができない」って思えるけど、実際は「△△ができる」んだよなmrsekut.icon
参考