haskell(或一般的函数式编程语言)的新手,所以我仍然很难将头脑中的逻辑转换为实际的代码。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)
我想确保每个允许有一个已添加的用户。上述逻辑将在验证:: [命令]功能被定义 - >布尔
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]
但除了我真的不知道从哪里开始实施验证:: [命令] - >布尔
编辑:刚刚发现Haskell有一个内置的反向功能,想我的reverseList不会被投入使用了
注意,'reverseList(X:XS)=(反向XS)++ [X]'是一个相当坏主意(n^2复杂度)。 – Jubobs 2014-11-23 22:02:46
是啊,有趣的是,我只是阅读一篇关于如何实现逆向函数的糟糕方法的文章。不过我会使用内置的反转功能! – user3277633 2014-11-23 22:06:44