是否可以在 D 中通用地实现 amb 运算符?
是否可以在 D 中通用地实现 amb 运算符?
http://www.haskell.org/haskellwiki/Amb
http://www.randomhacks.net/articles/2005/10/11 /amb-operator
我想到的排序是:
amb([1, 2]) * amb([3, 4, 5]) == amb([3, 4, 5, 6, 8, 10])
amb(["hello", "world"]) ~ amb(["qwerty"]) == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "world"]) ~ "qwerty" == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "very long string"]).length = amb([5, 16])
在最后两个示例中,确实需要将 ~ 和 .length '提升'到 amb 中“上下文”(单子?)。在前两个示例中,运算符应该仅应用于 amb 的内容。
我已经进行了简短的尝试,但是在尝试提升包装类型的运算符/方法/属性(本例中为 *、~ 和 .length)时遇到了问题。在 D 中应该如何完成?
谢谢,
克里斯。
Is it possible to generically implement the amb operator in D?
http://www.haskell.org/haskellwiki/Amb
http://www.randomhacks.net/articles/2005/10/11/amb-operator
The sort of thing I'm thinking of is:
amb([1, 2]) * amb([3, 4, 5]) == amb([3, 4, 5, 6, 8, 10])
amb(["hello", "world"]) ~ amb(["qwerty"]) == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "world"]) ~ "qwerty" == amb(["helloqwerty", "worldqwerty"])
amb(["hello", "very long string"]).length = amb([5, 16])
In the last two examples, there really needs to be a 'lifting' of the ~ and .length into the amb 'context' (a monad?). In the first two examples, the operators should just be applied to the amb's contents.
I've given it a brief try, but I'm having problems when trying to lift the wrapped-type's operators/methods/properties (*, ~ and .length in this example). How should this be done in D?
Thanks,
Chris.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,这是可能的。这就是我的想法。
非常感谢 BCS 找出了解决二元运算歧义的方法。
我必须创建一个新范围来遍历两个
Amb
之间的二进制运算结果,但我认为无论如何效果最好。对于那些刚接触 D 并感到好奇的人来说,所有这些
string
内容都是在编译时完成的,因此在运行时不需要解析代码或类似的东西 - 它几乎与手动一样高效 -用 C 对其进行编码。Yes, it is possible. Here's what I came up with.
Lots of thanks to BCS for figuring out how to resolve the binaryOp ambiguities.
I had to create a new range for traversing the result of a binary op between two
Amb
's, but I think that works out best anyway.For those that are new to D, and are curious, all that
string
stuff is done at compile time, so there's no parsing code at runtime or anything like that -- it's pretty much as efficient as hand-coding it in C.