Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
Haskell 可以退出发电机吗?_Haskell_List Comprehension - Fatal编程技术网

Haskell 可以退出发电机吗?

Haskell 可以退出发电机吗?,haskell,list-comprehension,Haskell,List Comprehension,考虑以下几点: list = [1,3..] generate n = [compute y | y <- list , (compute y) < n ] compute a = ... whatever ... 在进入列表的最后一个元素之前,是否可以退出生成器 e、 g.如果计算y>20? 我想节省计算能力。我只需要小于n的元素 我是哈斯克尔的新手。一个简单的答案可能是最好的答案。Haskell的奇妙之处在于它很懒。如果你说 > let x = generate 1

考虑以下几点:

list = [1,3..]

generate n = [compute y | y <- list , (compute y) < n ] 

compute a = ... whatever ...
在进入列表的最后一个元素之前,是否可以退出生成器 e、 g.如果计算y>20? 我想节省计算能力。我只需要小于n的元素


我是哈斯克尔的新手。一个简单的答案可能是最好的答案。

Haskell的奇妙之处在于它很懒。如果你说

> let x = generate 100000
然后Haskell没有立即计算生成100000,它只是创建了一个开始计算的承诺,我们通常称之为thunk

如果在计算y>20之前只需要元素,则可以执行以下操作

> takeWhile (<= 20) (generate 100000)
这将对从1到无穷大的所有整数值进行延迟引用。然后你可以做类似的事情

> take 10 $ map (* 10) $ drop 12345 $ map (\x -> x ^ 2 + x ^ 3 + x ^ 4) $ filter even nums
[3717428823832552480,3718633373599415160,3719838216073150080,3721043351301172120,3722248779330900000,3723454500209756280,3724660513985167360,3725866820704563480,3727073420415378720,3728280313165051000]
虽然tihs看起来需要做很多工作,但它只计算返回您请求的10个元素所需的最小值。本例中取10的参数仍然是一个无限列表,我们首先获取所有的even,然后将代数表达式映射到它,然后删除前12345个元素,然后将所有剩余的无限元素乘以10。在Haskell中处理无限结构非常常见,而且通常是有利的

作为旁注,您当前对generate的定义将做额外的工作,您可能需要类似的东西

generate n = [compute_y | y <- list, let compute_y = compute y, compute_y < n]

Haskell的奇妙之处在于它很懒。如果你说

> let x = generate 100000
然后Haskell没有立即计算生成100000,它只是创建了一个开始计算的承诺,我们通常称之为thunk

如果在计算y>20之前只需要元素,则可以执行以下操作

> takeWhile (<= 20) (generate 100000)
这将对从1到无穷大的所有整数值进行延迟引用。然后你可以做类似的事情

> take 10 $ map (* 10) $ drop 12345 $ map (\x -> x ^ 2 + x ^ 3 + x ^ 4) $ filter even nums
[3717428823832552480,3718633373599415160,3719838216073150080,3721043351301172120,3722248779330900000,3723454500209756280,3724660513985167360,3725866820704563480,3727073420415378720,3728280313165051000]
虽然tihs看起来需要做很多工作,但它只计算返回您请求的10个元素所需的最小值。本例中取10的参数仍然是一个无限列表,我们首先获取所有的even,然后将代数表达式映射到它,然后删除前12345个元素,然后将所有剩余的无限元素乘以10。在Haskell中处理无限结构非常常见,而且通常是有利的

作为旁注,您当前对generate的定义将做额外的工作,您可能需要类似的东西

generate n = [compute_y | y <- list, let compute_y = compute y, compute_y < n]

谢谢我试着用takeWhile,效果很好。但我在理解发生的问题时遇到了问题。非常好,谢谢。我试着用takeWhile,效果很好。但我在理解发生的问题时遇到了问题。完美的,完美的