Haskell 使用foldr和bind以无终止

Haskell 使用foldr和bind以无终止,haskell,functional-programming,Haskell,Functional Programming,因此,本质上,我有一个封装在MaybeT中的一元函数,我想使用Nothing作为递归的终止条件 我对foldr的理解是,如果它能够在不消耗整个列表的情况下产生结果,那么它可以安全地用于无限列表,即foldr(&&&)True$repeat False仍然能够返回False 目前我有: repeaterM a f = foldr (=<<) (return a) $ repeat f repeaterM a f=foldr(= 所以 如你所料 但是 相反,这也行不通(谢谢是7s) 所

因此,本质上,我有一个封装在
MaybeT
中的一元函数,我想使用
Nothing
作为递归的终止条件

我对
foldr
的理解是,如果它能够在不消耗整个列表的情况下产生结果,那么它可以安全地用于无限列表,即
foldr(&&&)True$repeat False
仍然能够返回
False

目前我有:

repeaterM a f = foldr (=<<) (return a) $ repeat f
repeaterM a f=foldr(=
所以

如你所料

但是

相反,这也行不通(谢谢是7s)

所以

如你所料

但是


相反,这也行不通(谢谢是7s).

为什么不
go a f=f a>=\a'->go a'f
?甚至可以让它
go f a=f a>=go f
摆脱lambda。这看起来确实有效,而且比我现在做的更优雅。我最初是从一个只执行n次操作的函数中概括出来的,使用一个列表,因此是折叠。不过,我还是希望太长了,读不下去了。你需要的是TL;DR <代码>也许的代码>为什么不>代码>去F= F a> = 'a'?> >“f>代码”?甚至可以使它<代码>转到fa= f a> >去f>代码>以摆脱lambda。这看起来确实有效,而且看起来比我做的更优雅。我最初是从这个推广的。太长了,读不下去了,我想知道为什么这个函数不起作用。我想知道为什么这个函数不起作用。你需要的是TL;DR <代码>也许<代码> >代码> =代码> FordL</代码>永远不会终止在无限的列表中。Aha,现在我明白了。我自己在计算实际如何建立时困惑。我有一个线索,它是沿着这些线,但我不能完全在我的脑海中计算出来。谢谢!
foldl
永远不会在无限列表上终止。啊哈,现在我明白了。我对计算是如何实际建立的感到困惑。我有一个线索,它是沿着这些线的,但我不能完全工作在我脑子里,谢谢!
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
   ...
repeaterM a f = foldl (>>=) (return a) $ repeat f