小编Pyg*_*ion的帖子

程序结构 - 简单的命令行待办事项应用程序 - 什么是Haskell方式?

背景:我正在使用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)
Run Code Online (Sandbox Code Playgroud)

但后来我开始想知道如何最好地存储这种类型的物体.这是否意味着我将它们存储在一个平面文件中?有没有办法将像这样的高度指定类型的对象与数据库中的字段/列相关联?

当我考虑使用Sqlite数据库时,似乎所有的工作都将在数据库调用中完成,而Haskell类型将与它相关性很小.这看起来很糟糕.

总之,问题是如何最好地模拟我的简单待办事项列表应用程序的数据结构,以符合我正在寻求用这个项目实践的函数式编程和Haskell理想的概念?

sql database haskell functional-programming data-structures

7
推荐指数
1
解决办法
937
查看次数

List.rev表现得很奇怪吗?

我是OCaml的新手,并试图将其List.append作为一项学习练习.这就是我所拥有的:

let rec append a b =
    match (List.rev a) with
       []       -> b
       | x:: xs -> append xs (x::b)
Run Code Online (Sandbox Code Playgroud)

这似乎有效,直到论证a有两个以上的元素.例:

# append [1;2] [3;4] 
- : int list = [1; 2; 3; 4]
# append [1;2;3] [4;5;6]
- : int list = [2; 1; 3; 4; 5; 6]
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我已经检查过了,然后List.rev [1;2;3]回来了int list = [3; 2; 1].我知道我的实现是天真的,而不是(还)懒惰,但它似乎应该工作.

reverse ocaml functional-programming list append

4
推荐指数
1
解决办法
227
查看次数