首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算子比较与Prelude.compare

算子比较与Prelude.compare
EN

Stack Overflow用户
提问于 2016-10-29 04:27:11
回答 1查看 135关注 0票数 2

Haskell编程(2e)的第8章定义了数据Tree和二进制搜索函数occurs

代码语言:javascript
复制
data Tree a = Leaf a | Node (Tree a) a (Tree a)

occurs :: Ord a => a -> Tree a -> Bool
occurs x (Leaf y)                 = x == y
occurs x (Node l y r) | x == y    = True
                      | x < y     = occurs x l
                      | otherwise = occurs x r

练习3(第8章)要求用occurs重新定义Prelude.compare,并提出以下问题:

为什么这个新定义比原来的定义更有效?

在这里,我给出我的定义:

代码语言:javascript
复制
occurs :: Ord a => a -> Tree a -> Bool
occurs x (Leaf y)     = x == y
occurs x (Node l y r) = case compare x y of EQ -> True
                                            LT -> occurs x l
                                            GT -> occurs x r

但我看不出提高效率。有吗?

我是不是学错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-29 07:19:10

事实证明很简单:

代码语言:javascript
复制
occurs x (Node l y r) | x == y    = True
                      | x < y     = occurs x l
                      | otherwise = occurs x r

等于

代码语言:javascript
复制
occurs x (Node l y r) = if x == y
                            then True
                            else if x < y
                                then occurs x l
                                else occurs x r

比较(操作符==<)最多可用于xy (Tree-Node)两次。

至于

代码语言:javascript
复制
occurs x (Node l y r) = case compare x y of EQ -> True
                                            LT -> occurs x l
                                            GT -> occurs x r

xy (Tree-Node)进行一次比较,并保存结果与EQLTGT (Ordering)进行比较。

考虑更坏情况的费用:

代码语言:javascript
复制
operator-comparison = cost(compare(Tree-node)) * 2

代码语言:javascript
复制
Prelude.compare = cost(compare(Tree-node)) + cost(compare(Ordering))*2

随着Tree-node变得比Ordering更加复杂,Boost将是值得注意的。

谢谢n.m.

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

https://stackoverflow.com/questions/40316021

复制
相关文章

相似问题

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