Project Eulerの問題2を解決するためにGHCiを使用しています。
http://projecteuler.net/problem=2
無限リスト fib を次のように定義しました。
Prelude> let fibs = 1 : 2 : zipWith(+) fibs (テールフィブ)
次の方法でリスト内包表記を使用してみました。
プレリュード> [x | x<-fibs、x
mod
2 == 0、x<4000000] [1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657, 46368、75025、121393、196418、317811、514229、832040、1346269、2178309、3524578
_ x <- [1..], xmod
2 == 0, x<4000000]
しかし、シェルは 2 番目のコマンドでハングします。リスト内包表記がリストを作成できるのに、合計関数がそれを処理できない理由について、私は混乱しています。
私は実用的な解決策が
Prelude> sum $ filter even $ takeWhile (<= 4000000) fibs
しかし、リスト内包表記法が機能しないのに、なぜそれが機能するのかについて、私は再び混乱しています。