Это кажется разумным желанием, но у меня проблемы с типом. Я хотел бы иметь 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?
Show
); (b) сервер принимает значения любого такого типа; и (c) когда клиент получает ответ от сервера, он знает, какого типа он был отправлен? Шаг (c) будет камнем преткновения (подумайте, что произойдет, если сервер решит ответить одним и тем же значением дважды или не ответит вообще); вам, вероятно, понадобится тип суммы или что-то вродеTypeable
/Dynamic
. Экзистенциалы (то, что вы получаете с помощью GADT) никогда нельзя распаковать, чтобы узнать, каким был исходный тип. - person Antal Spector-Zabusky   schedule 07.07.2013