有人能否解释或提供一些关于在惰性计算中如何进行函数组合的资源?
例如,filter (/='W') . map toUpper $ "justaword"
在 Haskell 中与其非惰性计算的 Erlang 版本相比是如何工作的?
有人能否解释或提供一些关于在惰性计算中如何进行函数组合的资源?
例如,filter (/='W') . map toUpper $ "justaword"
在 Haskell 中与其非惰性计算的 Erlang 版本相比是如何工作的?
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
。