vis*_*vis 4 haskell lazy-evaluation
我怎么能在"不太严格"的表达式中使左手总和,以便我不评估整个列表xs.在该示例中,只有前3个元素足以知道第二个表达式(True)的结果.
xs=[1..10]
sum xs > 3
Run Code Online (Sandbox Code Playgroud)
ghci的:
?> let xs = [1..10]
?> :sp xs
xs = _
?> sum xs > 3
True
?> :sp xs
xs = [1,2,3,4,5,6,7,8,9,10]
Run Code Online (Sandbox Code Playgroud)
使用懒惰的天然.
Prelude Data.Number.Natural> let xs = [1..10] :: [Natural]
Prelude Data.Number.Natural> :sp xs
xs = _
Prelude Data.Number.Natural> sum xs > 3
True
Prelude Data.Number.Natural> :sp xs
xs = [Data.Number.Natural.S Data.Number.Natural.Z,
Data.Number.Natural.S
(Data.Number.Natural.S Data.Number.Natural.Z),
Data.Number.Natural.S _,_,_,_,_,_,_,_]
Run Code Online (Sandbox Code Playgroud)
为了更加懒惰,使用foldr而不是foldl这样sum做:
Prelude Data.Number.Natural> let xs = [1..10] :: [Natural]
Prelude Data.Number.Natural> let lazySum = foldr (+) 0
Prelude Data.Number.Natural> lazySum xs > 3
True
Prelude Data.Number.Natural> :sp xs
xs = Data.Number.Natural.S Data.Number.Natural.Z :
Data.Number.Natural.S
(Data.Number.Natural.S Data.Number.Natural.Z) :
Data.Number.Natural.S _ : _
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
318 次 |
| 最近记录: |