首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可能循环数据结构的函数

可能循环数据结构的函数
EN

Stack Overflow用户
提问于 2013-10-13 01:32:37
回答 1查看 765关注 0票数 18

如果我有一个递归ADT

代码语言:javascript
复制
data MyType = A | B | C MyType | D MyType MyType

我可以编写一个函数来确定MyType实例是否包含A,如下所示:

代码语言:javascript
复制
hasA :: MyType -> Bool
hasA A = True
hasA B = False
hasA (C x) = hasA x
hasA (D x y) = (hasA x) || (hasA y)

这将适用于非循环实例,但不会停止循环结构,例如

代码语言:javascript
复制
let x = C x in hasA x

相反,在本例中,它应该返回False。在其他情况下(使用D),它将错误地不是停止而是返回True

那么,问题是如何最容易地编写像hasA这样的处理循环结构的函数?Racketdefine/fix的形式中有一个特别好的特性,它允许您让像hasA这样的函数按照预期运行,并为上面示例中的结构返回False,几乎不需要任何额外的代码。有没有办法在Haskell中做类似的事情?有没有延期呢?

编辑:我现在发现define/fix实际上是a macro created by Matt Might,它利用了球拍的元编程功能,而不是一个内置的功能,但这并不会使它成为球拍的一个很好的功能。也许这个宏可以在Haskell中重现?

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

https://stackoverflow.com/questions/19337153

复制
相关文章

相似问题

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