• ? Haskell Подскажите пожалуйста.
    У меня есть такой класс:

    class Klass value param where {
    metod :: Monad m => (param -> m param) -> value -> m value
    }

    Идея такая, что для какого-то конкретного параметра param я могу сделать инстанции для пачки типов, и в дальнейшем делать разные преобразования этих типов, меняя лишь первый аргумент к metod. Монада нужна чтобы подмешивать разные State, самому классу принципиально пофиг что это за монада.

    Тут всё работает замечательно.

    Потом в какой-то момент мне надо уже 2 параметретрических функции: (param1 -> m param1) и (param2 -> m param2). Можно было бы сделать инстанции для Either param1 param2, но это неправильно — на практике функция никогда не будет возвращать не тот тип, что получила.

    Поэтому приходится переписать класс так:

    class Monad m => Klass m value param where {
    metod :: param -> value -> m value
    }

    Где param = (p1 -> m p1, p2 -> m p2).

    Классу по-прежнему пофиг что за монада m, но приходится втаскивать её в параметры класса, потому что иначе не описать тип param.

    Вопрос — может ли современная наука заменить param какой-тибудь лямбдой на уровне типа, чтобы убрать m из класса?

Replies (8)

  • @max630, Мой мозг взорвался. Почему нельзя сделать так?
    class Klass param value where
    metod :: Monad m => param -> value -> m value
  • @fmap, попробуй напиши инстанс. param содержит m
  • @max630, А, то есть проблема в том что они могут быть разными инстансами Monad? Тогда можно вынести в переменную:

    class Class' value param where
    method' :: Monad m => param m -> value -> m value

    newtype Param p1 p2 m = Param (p1 -> m p1, p2 -> m p2)

    instance Class' v (Param p1 p2) where
    method' = undefined

    Или оборачивание недопустимо?
  • @fmap, А. Тогда (param :: -> ) должен быть. Ну фиг знает.
  • @fmap, ну в принципе у меня как раз завёрнутый тип и получается на практике. Только в случае с одним параметром будет не очень красиво, а для 2 (и больше) пофиг, всё равно писанины много.

    Спасибо, поиграюсь с таким вариантом.
  • @fmap, сработало. Даже в одном месте мест получилось выкинуть явныю декларацию типа
  • @max630, хехе, главное чтоб от MultiParamTypeClasses проблем не было.
  • @fmap, ох, это там не самое страшное слово