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,效果很好。但我在理解发生的问题时遇到了问题。完美的,完美的