Haskell выражает связь между значениями типа - PullRequest
0 голосов
/ 26 сентября 2018

Я новичок в haskell, я начал для своей собственной "культуры" кодировать следующий проект https://owickstrom.github.io/domain-modelling-with-haskell-workshop/, моей первой попыткой было определить Бюджет и Проект как отдельные типы данных (как предложено автором), но быстропри работе с функцией getBudget мне не удалось найти способ связать данный проект с его бюджетом со ссылкой на поле projectID.[Я просто постепенно следую инструкции и создаю код по пути, лично я считаю, что бюджет должен быть «внутренним» атрибутом проекта, и нет необходимости создавать отдельную структуру для кодирования бюджета, которая должна приводить к попытке2, но тем не менее ...]

попытки1:

data Budget = Budget ProjectID Income Expenditure deriving Show
data Project = SingleP ProjectID Name| GroupP [Project] deriving Show

для целей тестирования Я создал два "экземпляра"

testProject = SingleP 1 "Haskell workshop"
testBudget = Budget 1 100000.0 50000.0

testProject <-> testBudget связаны с идентификатором проекта,Мне не удалось написать функцию, которая будет принимать идентификатор, а затем «искать» соответствующий бюджет и получать данные бюджета.Если этого не сделать, я думаю, что я должен создать тип данных, который «встраивает» отношение следующим образом (попытка 2):

data Budget = Budget Income Expenditure   
data Project = SingleP ProjectID Name Budget ....

, затем testProject = SingleP 1 "Haskell worskhop" testBudget

Мои вопросы: - ЯЯ правильно сказал, что невозможно закодировать такие отношения (я подозреваю, что это связано с неизменяемостью переменных, просто говоря, что я не могу «получить доступ» к testBudget в Haskell)?- любая такая «sql'ish» модель предметной области должна строиться вокруг «общего» типа данных, то есть типа, который «инкапсулирует» также отношение, потому что отношение не может быть запрограммировано функциональным образом.

1 Ответ

0 голосов
/ 26 сентября 2018

Нет, вы не правы.Эта функция может быть легко закодирована.

Вы можете начать, например, с двух списков типов [Budget] и [Project].

Затем, используя модуль Data.Map, вы можете создать два словаря, Map ProjectID Budget и Map ProjectId Project, и выполнить свои поисковые запросы по ним.Они будут служить в качестве двух таблиц базы данных.

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

Если вы вставите бюджет в тип данных вашего проекта, у вас будет только одна таблица, которая также может быть реализована как, конечно, Map.Затем, если бюджет проекта изменится, вам придется обновить эту таблицу, то есть создать ее копию с обновленной записью для этого проекта.Это также легко сделать с помощью функций из того же модуля Data.Map.

...