首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BST折叠函数广义版本中的过多参数

BST折叠函数广义版本中的过多参数
EN

Stack Overflow用户
提问于 2011-02-04 00:23:30
回答 2查看 592关注 0票数 0

运行折叠(+) 0示例会给出一个错误,说明(+)应用于太多的参数。为什么?

代码语言:javascript
运行
复制
data(Ord a, Show a, Read  a) => BST a = Void | Node {
    val :: a,
    left, right :: BST a
} deriving (Eq,  Ord,  Read,  Show)

sample = Node 5 (Node 3 Void Void) (Node 10 Void Void)

fold :: (Read a, Show a, Ord a) => (a -> b -> b ->  b) -> b -> BST a -> b
fold _ z Void         = z
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

发生检查:无法构造无限类型:a=a -> a可预测的原因:+' is applied to too many arguments In the first argument of折叠‘’,即表达式:折叠‘(+) 0示例中的’(+)‘

另见:折叠

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-04 00:28:04

您的fold需要一个类型为a -> b -> b -> b的函数作为它的第一个参数,即一个带有三个参数的函数。另一方面,(+)只使用两个参数。

如果应该更改fold,或者如果需要使用不同的函数调用它,则取决于您到底要做什么。

票数 1
EN

Stack Overflow用户

发布于 2011-02-04 03:13:05

您的问题是,您将该函数应用于3个参数。类型签名中的第一个参数说明了一切。

代码语言:javascript
运行
复制
fold :: (a -> b -> b -> b) -> b -> BST a -> b
fold f z (Node x l r) = f x (fold f z l) (fold f z r)

(+)只接受两个参数,但当传入它时,它尝试计算如下:

代码语言:javascript
运行
复制
(+) x (fold (+) z l) (fold (+) z r) -- 3 arguments! =P

您可能希望使用二进制函数( ->、-> a)折叠。假设您想使用(+)。你希望结果是这样的:

代码语言:javascript
运行
复制
fold f z (Node x l r) = x + (fold f z l) + (fold f z r)

从这里可以很容易地概括:只需将+替换为固定的f

代码语言:javascript
运行
复制
fold f z (Node x l r) :: (a -> a -> a) -> a -> BST a -> a
fold f z (Node x l r) = x `f` (fold f z l) `f` (fold f z r)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4893323

复制
相关文章

相似问题

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