Обратите внимание, что при вызове функции аргументы вычисляются заранее, в частности, в случае разбиения.Здесь в client
поток разделяется на регистр с помощью client initreq (req :: reqs)
, поэтому respsOut
в client 0 respsOut
оценивается перед отложенным хвостом:
reqsOut =
client 0 respsOut =
client 0 (case respsOut of (req :: reqs) => ...) =
client 0 (case (server regsOut) of (req :: regs) => ...) =
...
Вы можете отложить разделение с помощью
client initreq stream = initreq :: client (head stream) (tail stream)
Но тогда у вас все равно будет бесконечный цикл через server
:
reqsOut =
client 0 respsOut =
client 0 (server regsOut) =
client 0 (case regsOut of (req :: reqs) => ...) =
...
Вы можете отложить вычисление respsOut
, указав аргумент Lazy
:
client : Int -> Lazy (Stream Int) -> Stream Int
client initreq stream = initreq :: client (head stream) (tail stream)
И теперь client
может наконец построить Stream Int
без оценки его аргументов:
client 0 respsOut =
0 :: Delay (client (head (Force respsOut)) (tail (Force respsOut))) : Stream int