Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 哈斯凯尔:是“什么?”;列表理解“;使用渴望评估?_List_Haskell_List Comprehension_Lazy Evaluation - Fatal编程技术网

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]