W uzupełnieniu do innych odpowiedzi wyjaśniając problem, tu jest alternatywne rozwiązanie, uogólnione pracować level-monad
i stream-monad
że nadają się do badań nad przestrzeni nieskończonego wyszukiwania (Jest również kompatybilny z listy monady i logict
, ale te nie będą grać ładnie z nieskończonych przestrzeni poszukiwań, jak już dowiedziałem):
{-# 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+))
teraz na szybkie przeszukiwanie wszerz:
*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)]
alternatywnie:
*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)]
wyjście nie powinno być tak, że ograniczenie to x + y^2^2 = Z^2 i ma takie same zestawy nawet niezależnie od kolejności. – omega
Myślę, że brakuje niektórych strażników lub czegoś, na podstawie kodu w pytaniu, myślę, że chcą tylko pitagorejskich trójek. – DarkOtter
@DarkOtter: pominięto ten bit, poprawiono. –