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

时间:2012-01-27 10:58:45

标签: haskell functional-programming erlang lazy-evaluation

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

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

1 个答案:

答案 0 :(得分: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")

现在第一个字符可用,因此对于像null这样的查询或像take 1这样的函数,没有进一步的工作。如果消费者要求更多字符,它们将逐一生成,直到字符串结束。

示例:

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

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