def
- это просто предопределенный объект Settings s
(его определение не заботится о том, какой тип s
может потребоваться), а не функция. Просто передайте его как любое другое значение (но, как указывает Даниэль Вагнер, с конкретным типом, поскольку def
является полиморфной константой ).
proxyMain (def :: Settings Foo)
-- Or, using the TypeApplication extension
-- proxyMain @Foo def
(где Foo
- это любой тип с экземпляром HStream
, который вы используете).
forall s . HStream s
является ограничением (forall s
является необязательным; оно могло быть записано proxyMain :: HStream s => Settings s -> IO ()
). Теоретически, однажды можно было создать значение типа Settings Int
. Без ограничения proxyMain
примет это в качестве аргумента. Предполагая, что Int
не является экземпляром HStream
, ограничение не позволит proxyMain
принять его.