Кажется, что это разумная вещь, но у меня проблемы с типом. Я хотел бы иметь Client
, который может отправить список параметров Server
, который выберет один и вернет выбранный элемент. Так что-то вроде этого:Труба с динамическим типом запроса/ответа?
module Toy where
import Pipes
asker :: Monad m =>() -> Client ([a], a -> String) a m()
asker() = do
_ <- request ([0.0, 2.0], show)
_ <- request (["3", "4"], show)
return()
Идея заключается в том, что сервер может вызвать функцию a -> String
на каждом элементе списка, чтобы отобразить их пользователю. Я хотел бы иметь возможность изменять a, пока список и функция совпадают.
Возможно ли это как можно? Может быть, ограничения, которые я хочу, можно каким-то образом закодировать в GADT?
Что делает сервер с запросом? Что он мог сделать, если даже не знал, какой тип он получит? Если он может преобразовать только этот тип в String (используя эту функцию), почему бы вам не передать строку в первом случае? – bennofs
Я думаю, это правда. Было бы неплохо не преобразовать ответ из String, но это не огромная сделка. – ajp
@ajp: Идея состоит в том, что (а) клиент отправляет значения типа * some *, которые соответствуют интерфейсу (* например, * 'Show'); (b) сервер принимает значения * any * такого типа; и (c) когда клиент получает ответ от сервера, он знает, какой тип он отправил? Шаг (c) станет точкой привязки (подумайте, что произойдет, если сервер решит ответить с одинаковым значением дважды или вообще не будет); вы, вероятно, захотите получить тип суммы или что-то вроде 'Typeable' /' Dynamic'. Экзистенциалы (то, что вы получаете с GADT) никогда не могут быть распакованы, чтобы узнать, что такое оригинальный тип. –