7

背景:我正在我的第一個完整的程序Haskell,一個簡單的命令行列表應用程序的命令行上工作。程序結構 - 簡單的命令行列表應用程序 - Haskell的方式是什麼?

我的問題是一個結構,有兩個層次:(1)最好的方法是什麼?和(2)什麼是Haskell(功能)的方式來做到這一點?我這樣說的原因是因爲我懷疑可能有一種更快或更簡單的方法來忽略功能性編程的原理。我希望以更優雅和清晰的方式來做,因爲它比其他任何事都更像是一次學習練習。

請記住,我會(顯然)像應用程序有點持久。現在桌面上的兩個選項是將信息存儲在一個平面文本文件中或交替存儲在Sqlite數據庫中。

浮現在腦海的第一個結構是這樣的,其中TodoList的類型的對象是一個簡單的待辦事項列表:

import Data.List 
import Data.Time 

data ToDo = ToDo { 
     todoId  :: Int, 
     todoDue  :: ZonedTime, 
     todoCreated :: UTCTime, 
     todoItem  :: String, 
     todoPriority :: Priority, 
     todoStatus :: Status 
     } 
     deriving (Show, Read) 

type ToDoList = [ToDo] 

data Priority = Low | Medium | High 
     deriving (Show, Read, Eq, Ord) 

data Status = Complete | InProgress | Open 
     deriving (Show, Read, Eq, Ord) 

但後來我開始琢磨如何更好地存儲這種類型的對象。這是否意味着我將它們存儲在平面文件中?有什麼辦法可以將這種高度指定類型的對象與數據庫中的字段/列關聯起來嗎?

當我考慮使用Sqlite數據庫時,似乎所有的工作都將在數據庫調用中完成,而Haskell類型與它的關係相對較小。這看起來很糟糕。

總之,問題是如何最好地模擬我的簡單待辦事項列表應用程序的數據結構,以符合我正在尋求在此項目中實踐的函數式編程和Haskell理想的概念?

+0

什麼是「todoId」字段爲Ord實例?除非它有一些用戶可見的含義,否則你可能不需要它。 Haskell不是數據庫,所以你不需要主鍵。 – 2010-12-08 06:31:33

回答

7

顯示/讀取組合是序列化和反序列化應用程序內部狀態的極其簡單的方法,並且由於純度,它基本上總是可以工作。此外,你會得到很好的練習,編寫切片和切塊列表的函數,因爲你可以將列表視爲完全加載到內存中(也許如果你想使用更高效的數據結構,你可以看看如何優化不同的查詢)

例如,如果我想找到一些日之前到期的所有項目,我可以在此使用上,由於過濾器寫:

dueBefore (ToDoList ts) d = ToDoList (filter (\t -> due t <= d) ts) 

一些風格您的僞代碼上的nitpicks:

  • 由於所有acces sor函數(id,die。創建...)被轉儲到模塊範圍的命名空間中,爲它們加前綴/後綴名稱(如todoId,todoDie)是很好的風格。在這個特殊情況下,id是一個真正的功能,所以你不應該影子!

  • ToDoList是具有一個值的單個構造函數數據類型;你可能實際上只是想要一個新類型或類型的同義詞。 (練習:把上面的代碼片段,其中一種類型的同義詞工作)

  • 你可能想對優先級和狀態

+0

我需要:輸入ToDoList = [ToDo]? – Pygmalion 2010-12-08 02:31:40

2

我認爲一個平面文件將使您的生活更輕鬆,並會只是工作,除非你有工作的這樣一個可怕的積壓,你需要一個數據庫來保存這一切,P

我會建議閱讀Learn You a Haskell for Great Good,或至少,這chapter。它甚至包含一個類似於你正在編寫的TODO應用程序。

現在,你應該沒有問題寫和讀所有的值到一個文件,只要他們都派生顯示和讀取。

相關問題