![](/img/trans.png)
[英]what is the relationship between Haskell's FreeT and Coroutine type
[英]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 Budget
和Map ProjectId Project
,並對它們運行查詢。 這些將用作兩個數據庫表。
如果預算和項目表分別存在,則可以將不同的預算和項目表配對為查詢函數的參數。
如果將預算放入項目數據類型中,則只有一個表,當然也可以將其實現為Map
。 然后,如果項目預算發生變化,則必須更新該表,即使用該項目的更新條目創建其副本。 使用同一Data.Map
模塊中的函數也可以輕松完成此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.