состояние haskell и классы типов - PullRequest
0 голосов
/ 02 июня 2011

как я могу сгруппировать getX и putX в экземпляре класса?приведенный ниже код является ответом на этот пост Метод установки классов в Haskell с использованием State-Monad


import Control.Monad.State

data Point = Point { x :: Int, y :: Int } deriving Show

getX :: State Point Int
getX = get >>= return . x

putX :: Int -> State Point ()
putX newVal = do
    pt - get
    put (pt { x = newVal })

increaseX :: State Point ()
increaseX = do
    x - getX
    putX (x + 1)

Позже, я надеюсь, я реализую установщики и получатели для иерархии из 2 классов, носейчас я просто хочу сделать что-то вроде этого:


class A a where

   putX :: Int -> State Point ()

instance A (State Point) where

    putX newVal = do
        pt - get
            put (pt { x = newVal })
 

1 Ответ

1 голос
/ 02 июня 2011

Вы, кажется, смешиваете здесь несколько концепций, так что я не совсем уверен, чего вы хотите достичь. Несколько мыслей о том, что вы можете быть после:

  • Доступ к полю , т. Е. Способ проверки или замены элемента большей структуры данных. Это на самом деле не поддается классу типов, потому что для многих комбинаций «внутреннего поля» и «структуры данных» будет возможно более одного метода доступа. Абстракции по этим направлениям часто называют «линзами».

  • Stateful ссылки в некотором родовом виде. По большей части в монаде State это сводится к объединению чего-то вроде вышеупомянутых линз со стандартными get и put. В этом случае у вас может быть класс типов для комбинации конкретной монады и типа данных аксессора, но это не очень-то много значит.

  • Перегрузка доступа к определенному полю , так что функции могут работать с любым типом данных, который содержит поле «x». В этом случае я предполагаю, что вы также захотите «у», как своего рода класс типов для 2D точек. Однако это совершенно не связано с вышеуказанными проблемами.

Возможно, вы могли бы уточнить вашу цель?

...