折り目は視覚的に把握しやすいかもしれません:
foldr g z [a,b,c...,x] === g a (g b (g c (g ... (g x z) ... )))
したがってg p r
、2 番目の引数を使用しない場合、それ以上のリスト アクセスは強制されません。||
あなたが言ったように、 (「論理和」)の短絡動作のためです。
そしてfoldl g z [a,b,c...,x] === (g ... (g (g (g z a) b) c) ... x)
。
関数を読むには、最初に、折りたたみが素数のリスト に適用されていることに気付き[2,3,5,7,11,13,17..]
ます。したがって、次のように読むことができます
isPrime n = n > 1 &&
foldr (\p r -> p*p > n || ((n `rem` p) /= 0 && r)) True primes
===
isPrime n = n > 1 &&
(2*2 > n || (rem n 2 /= 0 &&
(3*3 > n || (rem n 3 /= 0 &&
(5*5 > n || (rem n 5 /= 0 &&
-- the expansion stops when p*p > n
-- because (True || r) === True
......................... &&
(True) ... ))))))
の結合関数ではfoldr
、2 番目の引数はリストの残りを折りたたんだ「結果」です。r
その意味で示唆に富んだ名前です。