{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,5,26]],"date-time":"2026-05-26T23:05:21Z","timestamp":1779836721860,"version":"3.53.1"},"reference-count":0,"publisher":"Cambridge University Press (CUP)","issue":"4","license":[{"start":{"date-parts":[[2000,11,3]],"date-time":"2000-11-03T00:00:00Z","timestamp":973209600000},"content-version":"unspecified","delay-in-days":125,"URL":"https:\/\/www.cambridge.org\/core\/terms"}],"content-domain":{"domain":[],"crossmark-restriction":false},"short-container-title":["J. Funct. Prog."],"published-print":{"date-parts":[[2000,7]]},"abstract":"<jats:p>Every functional programmer knows the technique of \u201creplacing failure by a list of \nsuccesses\u201d (Wadler, 1985), but wise programmers are aware also of the possibility \nthat the list will be empty or (worse) divergent. In fact, the \u201clists of successes\u201d \ntechnique is equivalent to the incomplete depth-first search strategy used in Prolog.<\/jats:p>\n                  <jats:p>\n                    At heart, the idea is quite simple: whenever we might want to use a \u2018multi-function\u2019 such as \n\u2018\n                    <jats:italic>f<\/jats:italic>\n                    \u2019 [ratio   ][ratio   ] \u03b1 [Rarr    ] \u03b2 that can return many results or none, we replace it by a \ngenuine function\n                    <jats:italic>f<\/jats:italic>\n                    [ratio   ][ratio   ] \u03b1 \u2192 \u03b2\n                    <jats:italic>stream<\/jats:italic>\n                    that returns a lazy stream of results, and \nrely on lazy evaluation to compute the answers one at a time, and only as they are needed. For \nthe sake of clarity, I will distinguish between the types of finite lists (\u03b1\n                    <jats:italic>list<\/jats:italic>\n                    ) and of \npotentially infinite, lazy streams (\u03b1\n                    <jats:italic>stream<\/jats:italic>\n                    ), though both may be implemented in the \nsame way. Following the conventions used in ML, type constructors follow their argument types.\n                  <\/jats:p>","DOI":"10.1017\/s0956796800003749","type":"journal-article","created":{"date-parts":[[2002,7,27]],"date-time":"2002-07-27T09:26:15Z","timestamp":1027761975000},"page":"397-408","source":"Crossref","is-referenced-by-count":12,"title":["Combinators for breadth-first search"],"prefix":"10.1017","volume":"10","author":[{"given":"MICHAEL","family":"SPIVEY","sequence":"first","affiliation":[],"role":[{"vocabulary":"crossref","role":"author"}]}],"member":"56","published-online":{"date-parts":[[2000,11,3]]},"container-title":["Journal of Functional Programming"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/www.cambridge.org\/core\/services\/aop-cambridge-core\/content\/view\/S0956796800003749","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2026,5,26]],"date-time":"2026-05-26T22:35:34Z","timestamp":1779834934000},"score":1,"resource":{"primary":{"URL":"https:\/\/www.cambridge.org\/core\/product\/identifier\/S0956796800003749\/type\/journal_article"}},"subtitle":[],"short-title":[],"issued":{"date-parts":[[2000,7]]},"references-count":0,"journal-issue":{"issue":"4","published-print":{"date-parts":[[2000,7]]}},"alternative-id":["S0956796800003749"],"URL":"https:\/\/doi.org\/10.1017\/s0956796800003749","relation":{},"ISSN":["0956-7968","1469-7653"],"issn-type":[{"value":"0956-7968","type":"print"},{"value":"1469-7653","type":"electronic"}],"subject":[],"published":{"date-parts":[[2000,7]]}}}