5

假设我想要一个 type 的函数[[a]] -> [[b]] -> [[(a, b)]]。我确信我可以弄清楚一些事情,但很可能,它不会像,例如, zipWith zip它也有那种类型那么干净。

将这种类型签名输入到 Hoogle 中会给我一些功能来填补这个角色,但它们来自leancheckandextrapolate包,我不想在没有充分理由的情况下将它们拖到我的项目中。

鉴于您可以通过等式推理计算函数组合,我想知道这个过程是否存在逆向:有没有一种方法可以“分解”复杂类型签名并将其简化为最简单的函数组合?

4

1 回答 1

1

感谢 DanielWagner 和 Willem Van Onsem,他们在评论中回答了我的问题。我认为某种类别理论分解结果只是代码生成。

exference正是我想要的。从文档中:

类型推断接受一个表达式并告诉你它的类型。这个过程可以反过来:我们递归地创建随机表达式树,同时检查它们是否匹配给定的输入类型。在每个步骤中,我们都会执行推理算法步骤的后退步骤。如果幸运的话,这个搜索会产生一个或多个表达式。


djinn包也从类型表达式生成代码,但支持的类型较少,文档也很少 。但是,与 exference 不同,它保证总是终止。

对于 emacs 用户,似乎djinn 已经集成到 ghc-mod中。


还有luqui的 Djest ,它在 Quickcheck 和以前的工具之间。它允许您输入几组输入和输出,程序将为此尝试并组成一个满足它们的功能。

感谢所有贡献并让我发现这些软件包的人。

于 2019-07-23T18:53:06.773 回答