2014-09-29 2 views
1

предположит, у меня есть эти записи:Как я могу «установить» поле в записи в Фреге?

data Group = Group { id :: Id, name :: Name } 
derive Show Group 

data Game = Game { world :: World, groups :: [Group], random :: FRandom } 
derive Show Game 

Я хотел бы добавить новую группу к игре, но я хотел бы избежать вызова конструктора игры, потому что, если позже я добавить поле к игре я не хочу измените все вызовы конструктора игры. Предположим, я хочу добавить новую группу в экземпляр игры. Каков наилучший способ сделать это?

ответ

1

Это очень просто.

Дано:

game = Game { .... } -- some game 
newgroup = Group { .... } -- some new group 

вы просто говорите:

game' = game.{groups <- (newgroup:)} 

прописанным:

Построить новую игру»из игры, но изменить поле группы, применяя (новая_группа :) для значения старой группы. Это, конечно, cons'es новая_группа к передней части ранее существовавших групп, ENCE это эквивалентно:

ng = newgroup : game.groups 
game' = game.{groups = ng} 

Маримутху имеет хороший блог о именно это здесь: http://mmhelloworld.github.io/blog/2014/03/15/frege-record-accessors-and-mutators/

Ваше решение не использовать конструктор Game очень мудрый. На самом деле, что я делаю в таких случаях, чтобы создать значение «по умолчанию», и сделать новый из умолчанию с этим:

rec.{name = value, another <- function, ...} 

синтаксис.