Подъем трубы для работы с кортежами

Мне нужна функция с типом Pipe a b m r -> Pipe (a, c) (b, c) m r.

Но сколько бы я ни играл с for, ~> или >~; Я не могу правильно сопоставить типы.

Вы можете помочь мне?


person utdemir    schedule 26.12.2016    source источник


Ответы (1)


Я не думаю, что это возможно в целом. Предположим, нам удалось это написать:

hypotheticalLift :: Pipe a b m r -> Pipe (a, c) (b, c) m r

Какое поведение должно быть у hypotheticalLift (yield b)? Предположительно, это должно быть то же самое, что и yield (b, c) для какого-то c, но какое c и почему?

person Daniel Wagner    schedule 26.12.2016
comment
Извините, я не понимаю вашей мысли. Я ожидал, что hypotheticalLift просто передаст второй аргумент кортежа как есть. Ему не нужно генерировать c, как и Control.Arrow.first. - person utdemir; 26.12.2016
comment
Это означает, что ему придется потреблять один c из восходящего потока для каждого c, отправленного в нисходящем направлении. Когда вы хотите yield b, вы ставите его в очередь, которая может стать сколь угодно большой, пока await выполнение a не даст вам c в качестве побочного эффекта, или вы немедленно await и ставите a в очередь до тех пор, пока оно вам не понадобится? Когда вы await и a, ставите ли вы сопутствующие c в очередь, которая может стать сколь угодно большой? - person Gurkenglas; 26.12.2016
comment
@Gurkenglas, о, теперь я это понимаю. Спасибо. - person utdemir; 27.12.2016