Могу ли я получить запись при сопоставлении с шаблоном на его содержимом? - PullRequest
1 голос
/ 21 февраля 2020

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

updateChr :: Database -> Database -> Database
updateChr db Database{mode=1, characters=chr} = db{characters=(map someFunc chr)}
updateChr db Database{mode=2, characters=chr} = db{characters=(map someOtherFunc chr)}

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

1 Ответ

10 голосов
/ 21 февраля 2020

Вы можете использовать в качестве шаблона [Haskell -report] :

updateChr :: Database -> Database
updateChr <b>db@</b>Database{mode=1, characters=chr} = db {characters=(map someFunc chr)}
updateChr <b>db@</b>Database{mode=2, characters=chr} = db {characters=(map someOtherFunc chr)}

Если вы всегда хотите отобразить characters Здесь вы можете использовать охранник:

updateChr :: Database -> Database
updateChr db@Database{mode=m, characters=chr} = db {characters=map <b>f</b> chr}
    where f | m == 1 = someFunction
            | otherwise = someOtherFunction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...