【发布时间】:2014-11-23 21:38:59
【问题描述】:
刚接触haskell(或一般的函数式编程语言),所以我仍然很难将脑海中的逻辑转化为实际代码。
鉴于以下
data User = User String deriving (Eq, Show)
data Task = Task String deriving (Eq, Show)
data Command =
Add User
| Create Task
| Allow (User, Task)
deriving (Eq, Show)
我想确保每个允许都有一个已添加的用户。上述逻辑将定义在一个函数 Verified :: [Command] -> Bool
example = [
Add (User "Michael"),
Create (Task "Laundry"),
Allow (User "Michael", Task "Laundry")
]
Verified example -- Return True
example2 = [
Add (User "Michael"),
Create (Task "Laundry"),
Allow (User "Bob", Task "Laundry")
]
Verified example2 -- Return False
以下是我的思考过程,如果您能帮我将其转化为代码/完善我的想法,我将不胜感激
反转命令列表。如果我看到带有用户和任务的允许,那么在列表下方的某处肯定有该特定用户的添加。否则,返回 false。
在 Prelude 中使用 elem 来查看命令中是否存在这样的 Add(我正在考虑递归)。
目前我只能成功创建一个反转列表的简单函数,
reverseList :: [Command] -> [Command]
reverseList [] = []
reverseList (x:xs) = (reverse xs) ++ [x]
但除此之外,我真的不知道从哪里开始实施已验证 :: [Command] -> Bool
编辑:刚发现Haskell内置了reverse功能,估计我的reverseList不会再用了
【问题讨论】:
-
请注意,
reverseList (x:xs) = (reverse xs) ++ [x]是一个非常糟糕的主意(n^2 复杂度)。 -
是的,有趣的是,我刚刚阅读了一篇关于如何实现反向功能的糟糕方法的文章。不过我将使用内置的反向功能!