簡體   English   中英

程序結構 - 簡單的命令行待辦事項應用程序 - 什么是Haskell方式?

[英]Program Structure — Simple Commandline To Do List App — What's the Haskell way?

背景:我正在使用Haskell中的第一個完整程序,這是命令行中的一個簡單的待辦事項列表應用程序。

我的問題是結構問題,有兩個層次:(1)最好的方法是什么? (2)什么是Haskell(功能)方法呢? 我這樣說的原因是因為我懷疑可能有一種更快或更簡單的方法來忽略函數式編程的原理。 我想以更優雅和清晰的方式做到這一點,因為它更像是一種學習練習而不是其他任何東西。

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

想到的第一個結構是這樣的,其中ToDoList類型對象只是ToDo項的列表:

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理想的概念?

Show / Read組合是一種非常簡單的序列化和反序列化應用程序內部狀態的方法,並且由於純度,它基本上總是有效。 此外,您可以很好地編寫切片和骰子列表的函數,因為您將能夠將列表視為完全加載到內存中(並且如果您想要使用更高效的數據結構,那么您可以查看優化不同查詢的方法。)

例如,如果我想在某個日期之前找到所有到期的項目,我可以使用過濾器來寫這個:

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

你的偽代碼上的一些樣式挑剔:

  • 由於所有訪問器函數(id,die。created ...)都被轉儲到模塊范圍的命名空間中,因此使用記錄名稱(例如todoId,todoDie)為它們添加前綴/后綴是一種很好的方式。 在這種特殊情況下, id是一個真正的函數,所以你不應該暗示它!

  • ToDoList是一個具有一個值的構造函數數據類型; 你可能實際上只是想要一個newtype或類型同義詞。 (練習:重寫上面的代碼片段以使用類型同義詞。)

  • 您可能需要優先級和狀態的Ord實例

我認為一個平面文件會讓你的生活變得更輕松,並且同樣會起作用,除非你有如此可怕的積壓工作,你需要一個數據庫才能完成所有工作; P

我會建議閱讀“ 了解大好事” ,或者至少是本章 它甚至包含一個類似於您嘗試編寫的簡短TODO應用程序。

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

暫無
暫無

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

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