簡體   English   中英

Haskell表達類型值之間的關系

[英]Haskell express relationship between type values

我是Haskell的新手,我從自己的“文化”開始,開始編寫以下項目的代碼https://owickstrom.github.io/domain-modelling-with-haskell-workshop/ ,我的第一次嘗試是將Budget and Project定義為單獨的數據類型(如作者所建議),但是在使用getBudget函數時,我無法找到一種方法來引用給定Project及其項目的預算(參考projectID字段)。 [我只是逐步遵循說明並在此過程中創建代碼,我個人認為預算應該是項目的“內在”屬性,無需創建單獨的結構來對預算進行編碼,但這會導致try2。 ]

attempt1:

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與項目的ID相關。 我沒有設法編寫一個將帶有ID然后“查找”相應預算並檢索預算數據的函數。 未能做到這一點,我認為我應該創建一個數據類型來“嵌入”這樣的關系(attempt2):

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

然后testProject = SingleP 1 "Haskell worskhop" testBudget

我的問題:-我是否正確地說不可能編寫這種關系,(我懷疑這是由於變量不變性,只是說我無法“訪問” Haskell中的testBudget)? -任何這樣的“ sql'ish”域模型都應該圍繞“ total”數據類型構建,即“封裝”該關系的類型,因為不能以功能方式對關系進行編程。

不,你不對。 該功能可以輕松編碼。

您可以從兩個列表開始,例如[Budget][Project]

然后,使用模塊Data.Map可以構建兩個字典Map ProjectID BudgetMap ProjectId Project ,並對它們運行查詢。 這些將用作兩個數據庫表。

如果預算和項目表分別存在,則可以將不同的預算和項目表配對為查詢函數的參數。

如果將預算放入項目數據類型中,則只有一個表,當然也可以將其實現為Map 然后,如果項目預算發生變化,則必須更新該表,即使用該項目的更新條目創建其副本。 使用同一Data.Map模塊中的函數也可以輕松完成此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM