foldr :: (a -> b -> b) -> b -> [a] -> b
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
そう
foldr (&&) True $ repeat False
= go (repeat False) where go [] = True ; go (y:ys) = y && go ys
= False && go (repeat False) where go [] = True ; go (y:ys) = y && go ys
= False
あなたが期待するように。
しかし
foldr (=<<) (return a) $ repeat f
= go (repeat f) where go [] = return a ; go (y:ys) = y =<< ys
= f =<< go (repeat f) where go [] = return a ; go (y:ys) = y =<< ys
= f =<< f =<< go (repeat f) where go [] = return a ; go (y:ys) = y =<< ys
= f =<< f =<< f =<< go (repeat f) where go [] = return a ; go (y:ys) = y =<< ys
...
ここで行っているのは、返されるまで、関数をそれ自身の結果に繰り返し適用することではありませんNothing
。
計算を最後から構築しています=<<
。LHS を実行する前に、それぞれの RHS を計算する必要があります。しかし、あなたは無限リストを持っているので、計算の最初に到達することはありません.
あなたは定義しようとするかもしれません
repeaterM a f = foldl (>>=) (return a) $ repeat f
代わりは。これもうまくいきません (is7s に感謝します)。