リスト全体を評価しないように、「あまり厳密ではない」式の左手の合計を作成するにはどうすればよいですかxs
。この例では、2 番目の式 ( ) の結果を知るには、最初の 3 つの要素だけで十分True
です。
xs=[1..10]
sum xs > 3
ぐち:
λ> let xs = [1..10]
λ> :sp xs
xs = _
λ> sum xs > 3
True
λ> :sp xs
xs = [1,2,3,4,5,6,7,8,9,10]
リスト全体を評価しないように、「あまり厳密ではない」式の左手の合計を作成するにはどうすればよいですかxs
。この例では、2 番目の式 ( ) の結果を知るには、最初の 3 つの要素だけで十分True
です。
xs=[1..10]
sum xs > 3
ぐち:
λ> let xs = [1..10]
λ> :sp xs
xs = _
λ> sum xs > 3
True
λ> :sp xs
xs = [1,2,3,4,5,6,7,8,9,10]
怠惰な自然を使用してください。
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 _,_,_,_,_,_,_,_]
さらに怠惰にするには、次の方法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 _ : _