• Haskell Мда. Долго мучался (с попыткой описать типы внутри своих where-функций), пока не нашёл ScopedTypeVariables, как ответ на свои мучения. Всё же, считаю, что они долджны быть частью стандарта и в книжках описываться. Интуиция для них, как по мне, и так вполне сильная.

Replies (10)

  • @kb, более сложный случай описывать лень, но общий рецепт такой:

    bar :: a
    bar = undefined

    foo = bar (proxy..)
    where
    bar' :: Proxy a -> a
    bar' _ = bar

    данный подход шире, чем ScopedTypeVariables. Енмип ScopedTypeVariables стандартом быть не могут, т.к. способны поломать существующий код [источник не указан 0 дней].
  • @kb, а в чём проблема записать типы для функций в where?
  • @qnikst, foo = bar' естественно
  • @qnikst, Если forall явно не выписан, то ничего же не должно поломаться, так? Ну а если выписан, то ссзб...
  • @fmap, наверное, я тут понял, что я недостаточно хорошо понимаю данную тему, т.к. не осилил написать минимальный репрезентативный пример где проявляется необходимость ScopedTypeVariables и следующий пример, где его не хватит, а нужны прокси.
  • @qnikst, Не знаю, у меня вот вчера наоборот без STVs не получилось обойтись: lpaste.net
    Там во втором случае 'asTypeOf (M1 r) _sel' должен был дать '_sel' тип 'M1 i c f p' причем из сигнатуры и с ограничениями(?). Но (Selector c) почему-то не вывелся.
  • @qnikst, Хелперами a la asTypeOf обычно можно обойтись, но ScopedTypeVariables обычно изящнее.

    Подозреваю что даже можно всегда, но получится стоя и в гамаке
  • @PineappleZombie, с меня в ближайшие дни пример, где ScopedTypeVariables не справится, насколько я понимаю на type families тип может не вывестись (во всяком случае у меня были такие случаи, но они слишком сложные, чтобы выкложить минимальный пример). А в целом — да в большинстве случаев ScopedTypeVariables это то, что надо.
  • @qnikst, Очень интересно посмотреть
  • @qrilka, в том, что получаешь "Could not deduce (a2 ~ a1) from ...", если функция и то, что в where содержит переменную (SomeClass a) => a -> ... . Как-то так.