У меня есть эти типы (и больше):
data Player = PlayerOne | PlayerTwo deriving (Eq, Show, Read, Enum, Bounded)
data Point = Love | Fifteen | Thirty deriving (Eq, Show, Read, Enum, Bounded)
data PointsData =
PointsData { pointsToPlayerOne :: Point, pointsToPlayerTwo :: Point }
deriving (Eq, Show, Read)
Я занимаюсь Теннисным ката , и в качестве части реализации я хотел бы использовать некоторые функции, которые позволяют мне получать или устанавливать очки для произвольного игрока, известного только во время выполнения. .
Формально мне нужны такие функции:
pointFor :: PointsData -> Player -> Point
pointFor pd PlayerOne = pointsToPlayerOne pd
pointFor pd PlayerTwo = pointsToPlayerTwo pd
pointTo :: PointsData -> Player -> Point -> PointsData
pointTo pd PlayerOne p = pd { pointsToPlayerOne = p }
pointTo pd PlayerTwo p = pd { pointsToPlayerTwo = p }
Как показано, моя проблема не в том, что я не могу реализовать эти функции.
Они, однако, выглядят подобными линзе , поэтому мне интересно, смогу ли я получить эту функциональность через библиотеку lens
?
В большинстве учебных пособий по объективам показано, как получить или установить конкретную именованную часть более крупной структуры данных. Это не совсем подходит для того, что я пытаюсь сделать здесь; скорее я пытаюсь получить или установить часть, определенную во время выполнения.