Структура программы - Простое приложение для работы с списком команд - Что такое способ Haskell? - PullRequest
7 голосов
/ 08 декабря 2010

Справочная информация: Я работаю над своей первой полной программой на 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, которые яищу практику с этим проектом?

Ответы [ 2 ]

7 голосов
/ 08 декабря 2010

Комбинация Show / Read - это чрезвычайно простой способ сериализации и десериализации внутреннего состояния вашего приложения, и из-за его чистоты в принципе всегда работает. Кроме того, вы получите хорошую практику написания функций, которые нарезают списки кубиков и кубиков, так как вы сможете обрабатывать список, как будто он полностью загружен в память (и, возможно, если вы захотите поиграть с некоторыми более эффективными структурами данных, вы можно посмотреть способы оптимизации разных запросов.)

Например, если я хочу найти все предметы, подлежащие оплате до какой-то даты, я могу написать это с использованием фильтра по времени:

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

Некоторые стилевые ножницы на вашем псевдокоде:

  • Поскольку все функции доступа (id, die. Создал ...) сбрасываются в пространство имен всего модуля, это хороший стиль - добавлять к ним префикс / суффикс к имени записи, например todoId, todoDie. В данном конкретном случае id - реальная функция, поэтому вам не следует ее скрывать!

  • ToDoList - это тип данных одного конструктора с одним значением; Вы, вероятно, на самом деле просто хотите новый тип или синоним типа. (Упражнение: переписать приведенный выше фрагмент кода для работы с синонимом типа.)

  • Возможно, вам нужен экземпляр Ord по приоритету и статусу

2 голосов
/ 08 декабря 2010

Я думаю, что простой файл облегчит вашу жизнь и будет работать так же хорошо, если у вас не будет такого ужасного отставания в работе, что вам понадобится база данных для всего этого; P

Я бы рекомендовал прочитать Learn You a Haskell for Great Good или, по крайней мере, эту главу . Он даже содержит краткое приложение TODO, подобное тому, что вы пытаетесь написать.

Теперь вы должны не иметь проблем с записью и чтением всех ваших значений в файл, при условии, что они все выводят Show и Read.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...