懒惰和功能组成(haskell,erlang)

Adi*_*Adi 9 erlang haskell functional-programming lazy-evaluation

有人可以解释或提供一些关于功能组合如何与懒惰相关的资源吗?

例如filter (/='W') . map toUpper $ "justaword",Haskell的工作方式与erlang中的对应方式相比如何?

Dan*_*her 13

每当需要另一个角色(或结束通知)时,下一个角色 - 如果有的话 - 被映射到大写,与'W'相比,如果不相等则被传递.

filter (/= 'W') . map toUpper $ "justaword"
~> filter (/= 'W') (toUpper 'j' : map toUpper "ustaword")
~> filter (/= 'W') ('J' : map toUpper "ustaword")
~> 'J' : filter (/= 'W') (map toUpper "ustaword")
Run Code Online (Sandbox Code Playgroud)

现在第一个字符可用,因此对于像null或类似的查询take 1,没有进一步的工作.如果消费者要求更多字符,则将逐一生成它们,直到到达字符串的末尾.

例:

Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't'
"TTTTTTTTTT"
Run Code Online (Sandbox Code Playgroud)

repeat产生无限列表,但只要消耗了有限部分,计算就会在有限时间内完成.但是,take 10 . filter (/= 'W') . map toUpper $ repeat 'w'不会终止,因为没有任何生成的字符通过它filter到达take 10.

  • 在严格(渴望,相反)的语言中,人们必须模拟懒惰才能获得相同的行为.有些语言比其他语言更容易,我更倾向于在erlang或F#中使用C语言(而且虽然我知道C,但几乎没有任何erlang或F#:).是否有两个遍历或一个急切的语言取决于编译器.原则上,过滤器和映射可以融合,但通常编译器需要证明映射函数的纯度和过滤谓词能够做到这一点.所以我希望在大多数情况下进行两次遍历,证明很难. (5认同)
  • 感兴趣的注释:Python的生成器主要用于允许这种惰性处理. (2认同)