首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >inOrder函数中的模式匹配

inOrder函数中的模式匹配
EN

Stack Overflow用户
提问于 2013-10-02 18:55:39
回答 3查看 130关注 0票数 0

我刚开始Haskell编程,以前从未使用过函数式语言。

我正在尝试编写一个函数,使用模式匹配,这将测试给定的整数列表是否按升序排列。如果是,它应该返回true,如果不是,则返回false。

代码语言:javascript
复制
inorder :: [Integer] -> Bool
inorder [] = True
inorder [x] = True
inorder (x:y:t) | x<=y && y<=head t = True
        | otherwise = False

这目前只比较给定列表的前两个元素。

如果列表中有一个整数在前面,那么Q1将如何将每个整数与它前面的整数进行比较呢?

这是家庭作业,我应该使用模式匹配,而不是被保护的方程来完成,但是我不得不使用这两种方法,因为我不确定模式匹配等同于“否则”是什么。

Q2是可能的吗,我将如何在没有警卫的情况下编写这个函数?

谢谢你抽出时间阅读。如果有什么不清楚的地方我很抱歉。任何帮助,提示或有帮助的链接将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-02 19:10:29

Q1。使用递归。您将比较前两个值,然后对其余的列表执行相同的操作,其中仍包含第二个值,因此将其与原始列表的第三个值进行比较:

代码语言:javascript
复制
inorder (x:y:t)
  | x <= y && inorder (y:t) = True -- We included y in the call to inorder
  | otherwise = False

Q2。是的,这是可能的。注意到在前面的函数中,当给定的项为True时,我们返回True,否则为False。这意味着我们可以返回术语的值,而不是使用守卫:

代码语言:javascript
复制
inorder (x:y:t) = x <= y && inorder (y:t)
票数 2
EN

Stack Overflow用户

发布于 2013-10-02 19:03:07

您需要进行递归调用:

代码语言:javascript
复制
inorder (x:y:t) | x<=y = inorder (y:t)
                | otherwise = False

你为什么想在没有警卫的情况下写作?

票数 0
EN

Stack Overflow用户

发布于 2013-10-02 19:44:28

你在找答案的路上,几乎可以肯定的是,你会想要交一份课堂作业。但我想提出另一种更接近于您在生产代码中想要做的事情的方法:即自己编写一些特定于域的逻辑,但是为递归逻辑重用现有的高阶函数。在这么小的例子中,很难看到好处;但是习惯于这种关注点的分离对于大型工程项目有很大的帮助。下面是一个例子,说明这将是什么样子。

代码语言:javascript
复制
-- this is the domain-specific logic
frontInOrder (x:y:_) = x <= y
frontInOrder _ = True

-- here we do the recursion by handing the list off to tails/all
inOrder = all frontInOrder . tails

当然,frontInOrder本身也可以有相当多的自行车。例如,您可能会想到这样的情况,甚至没有任何模式匹配:

代码语言:javascript
复制
sorted xs = sort xs == xs
frontInOrder = sorted . take 2
inOrder = all frontInOrder . tails

或者,如果线性时间和线性时间之间的差异对您的应用程序不太重要,甚至可以考虑没有其他辅助函数的inOrder xs = sort xs == xs。(通过支付这种对数运行时成本,您获得的好处是代码非常短--而且很难在短代码中隐藏bug!)

同样,我并不是建议在您的练习解决方案中做这样的事情:首先,您绝对应该手动编写几百个函数。但是,一旦您开始发现一些模式,您同样应该寻找代码重用的机会。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19144645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档