List 哈斯凯尔:是“什么?”;列表理解“;使用渴望评估?
我刚试过这个:List 哈斯凯尔:是“什么?”;列表理解“;使用渴望评估?,list,haskell,list-comprehension,lazy-evaluation,List,Haskell,List Comprehension,Lazy Evaluation,我刚试过这个: Prelude> [x*2|x<-[1..10]] [2,4,6,8,10,12,14,16,18,20] Prelude>[x*2 | x在哈斯克尔,一切(几乎)都是懒惰的,这没有什么区别 但如果您要求GHCi打印它(您对输入进行了打印),它将对所有内容进行评估 要查看它,请使用以下命令: Prelude> let xs = [x*2|x<-[1..10]] Prelude> :sprint xs xs = _ 这是一个无限的列表-现在如果你要
Prelude> [x*2|x<-[1..10]]
[2,4,6,8,10,12,14,16,18,20]
Prelude>[x*2 | x在哈斯克尔,一切(几乎)都是懒惰的,这没有什么区别
但如果您要求GHCi打印它(您对输入进行了打印),它将对所有内容进行评估
要查看它,请使用以下命令:
Prelude> let xs = [x*2|x<-[1..10]]
Prelude> :sprint xs
xs = _
这是一个无限的列表-现在如果你要求它打印出来,它将需要一些时间;)
对于F#的seq{…}
也是如此,但对于F#的列表则不是如此!您可以通过请求一个无限列表来测试这一点:
Prelude> take 10 [ x*2 | x <- [1..], x `mod` 3 == 0 ]
[6,12,18,24,30,36,42,48,54,60]
Prelude>take 10[x*2 | x谢谢,但我不太明白:sprint在“惰性评估”中做了什么,因为:Prelude>let a=2 Prelude>:sprint a=uu似乎仍在打印“u”:sprint
是一个“在不强制求值的情况下打印一个值。:sprint类似于:print,不同之处在于未求值的子项不绑定到新变量,它们只是用“\u1”表示。"-所以你可以检查什么get是被计算/强制的,什么不是在这个东西上的^^@viksantata这是因为2
在Haskell中不是一个计算值。它是一个多态表达式,其计算取决于它的类型。试试像2::Int
@Carl这样的东西吧……我完全误读了评论/问题-谢谢你指出这一点出来
Prelude> take 10 [ x*2 | x <- [1..], x `mod` 3 == 0 ]
[6,12,18,24,30,36,42,48,54,60]