gpt4 book ai didi

haskell - 如何在列表推导中有多个无限范围?

转载 作者:行者123 更新时间:2023-12-04 13:40:52 25 4
gpt4 key购买 nike

在haskell中,我有一个这样的列表理解:

sq = [(x,y,z) | x <- v, y <- v, z <- v, x*x + y*y == z*z, x < y, y < z]
where v = [1..]

但是,当我尝试 take 10 sq ,它只是卡住...
有没有办法处理多个无限范围?

谢谢

最佳答案

除了解释问题的其他答案之外,这里还有一个替代解决方案,可以与 level-monad 一起使用。和 stream-monad 适合在无限搜索空间上进行搜索(它也与 list monad 和 logict 兼容,但它们不能很好地与无限搜索空间一起使用,正如您已经发现的那样):

{-# LANGUAGE MonadComprehensions #-}

module Triples where

import Control.Monad

sq :: MonadPlus m => m (Int, Int, Int)
sq = [(x, y, z) | x <- v, y <- v, z <- v, x*x + y*y == z*z, x < y, y < z]
where v = return 0 `mplus` v >>= (return . (1+))

现在,进行快速广度优先搜索:
*Triples> :m +Control.Monad.Stream
*Triples Control.Monad.Stream> take 10 $ runStream sq
[(3,4,5),(6,8,10),(5,12,13),(9,12,15),(8,15,17),(12,16,20),(7,24,25),
(15,20,25),(10,24,26),(20,21,29)]

或者:
*Triples> :m +Control.Monad.Levels
*Triples Control.Monad.Levels> take 5 $ bfs sq -- larger memory requirements
[(3,4,5),(6,8,10),(5,12,13),(9,12,15),(8,15,17)]
*Triples Control.Monad.Levels> take 5 $ idfs sq -- constant space, slower, lazy
[(3,4,5),(5,12,13),(6,8,10),(7,24,25),(8,15,17)]

关于haskell - 如何在列表推导中有多个无限范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com