有人可以解释或提供一些关于函数组合如何与惰性相关的资源吗?
例如如何filter (/='W') . map toUpper $ "justaword"
在 Haskell 中工作与在 erlang 中的对应工作相比,后者并不懒惰?
每次需要另一个字符(或结束通知)时,下一个字符(如果有)将映射为大写,即与“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
,不做进一步的工作。如果消费者需要更多字符,它们将被一一产生,直到到达字符串末尾。
Example:
Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't'
"TTTTTTTTTT"
repeat
产生一个无限列表,但只要只消耗有限部分,计算就会在有限时间内完成。然而,take 10 . filter (/= 'W') . map toUpper $ repeat 'w'
不会终止,因为没有一个生成的字符通过filter
达到take 10
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)