Haskell 我能“;因式分解&x201D;打字签名?

Haskell 我能“;因式分解&x201D;打字签名?,haskell,hoogle,Haskell,Hoogle,假设我想要一个[[a]]->[[b]]->[[[(a,b)]]]类型的函数。我相信我能想出一些办法,但很有可能,它不会像同样有这种类型的zipWith-zip那样干净 在Hoogle中输入这种类型的签名给了我一些填补这个角色的函数,但是它们来自leancheck和extraction包,如果没有充分的理由,我不想将它们拖到我的项目中 考虑到你可以通过等式推理来计算函数组合,我想知道这个过程是否有相反的结果:有没有一种方法可以“分解”一个复杂的类型签名并将其简化为最简单的函数组合?谢谢Daniel

假设我想要一个
[[a]]->[[b]]->[[[(a,b)]]]
类型的函数。我相信我能想出一些办法,但很有可能,它不会像同样有这种类型的zipWith-zip那样干净

在Hoogle中输入这种类型的签名给了我一些填补这个角色的函数,但是它们来自
leancheck
extraction
包,如果没有充分的理由,我不想将它们拖到我的项目中


考虑到你可以通过等式推理来计算函数组合,我想知道这个过程是否有相反的结果:有没有一种方法可以“分解”一个复杂的类型签名并将其简化为最简单的函数组合?

谢谢DanielWagner和Willem Van Onsem,谁在评论中回答了我的问题。我以为是某种范畴理论的分解结果只是代码生成

这个包裹正是我想要的。从文件中:

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


该包还从类型表达式生成代码,但支持的类型较少,并且具有。但是,与EXFENCE不同,它保证始终终止

对于emacs用户来说,似乎是这样


luqui还提供了一个介于Quickcheck和以前的工具之间的工具。它允许您输入几组输入和输出,程序将尝试为这些输入和输出编写一个满足它们的函数


感谢所有的贡献者,让我发现了这些软件包。

这听起来有点像djinn:最简单的当然是
\\\\\>[]
。这种反对可能会让你觉得很愚蠢,但它是一种严重的反对:
zipWith-zip
绝不是这种类型的明显的、规范的、唯一合理的功能。除了这个愚蠢、无用的函数(以及无数其他愚蠢、无用的函数)之外,我至少还能想到另外两个非常明智和有用的函数。@RobinZigmond:基于这个问题,我认为OP希望根据类型签名自动生成函数。(…如果djinn适合您,请参见;与djinn不同,它可以处理列表之类的递归类型,但代价是如果您要求它非常困难,它可能不会终止。)此外,我的玩具项目也适合您。它生成给定类型签名的函数,并查找通过您给定测试的函数。例如
length(f xs ys)==min(length xs)(length ys)
可能会找到你的(不过我真的需要清理一下以提高可用性)