[英]laziness and function composition (haskell, erlang)
有人可以解釋或提供一些關於功能組合如何與懶惰相關的資源嗎?
例如,如何filter (/='W') . map toUpper $ "justaword"
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
這樣的函數,沒有進一步的工作。 如果消費者要求更多字符,則將逐一生成它們,直到到達字符串的末尾。
例:
Prelude Data.Char> take 10 . filter (/= 'W') . map toUpper $ repeat 't'
"TTTTTTTTTT"
repeat
產生一個無限列表,但只要只消耗一個有限部分,計算就會在有限的時間內完成。 但是, take 10 . filter (/= 'W') . map toUpper $ repeat 'w'
take 10 . filter (/= 'W') . map toUpper $ repeat 'w'
take 10 . filter (/= 'W') . map toUpper $ repeat 'w'
不會終止,因為所有生成的字符都沒有通過filter
到達take 10
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.