haskell - 我可以“分解”类型签名吗?
问题描述
假设我想要一个 type 的函数[[a]] -> [[b]] -> [[(a, b)]]
。我确信我可以弄清楚一些事情,但很可能,它不会像,例如, zipWith zip
它也有那种类型那么干净。
将这种类型签名输入到 Hoogle 中会给我一些功能来填补这个角色,但它们来自leancheck
andextrapolate
包,我不想在没有充分理由的情况下将它们拖到我的项目中。
鉴于您可以通过等式推理计算函数组合,我想知道这个过程是否存在逆向:有没有一种方法可以“分解”复杂类型签名并将其简化为最简单的函数组合?
解决方案
感谢 DanielWagner 和 Willem Van Onsem,他们在评论中回答了我的问题。我认为某种类别理论分解结果只是代码生成。
包exference正是我想要的。从文档中:
类型推断接受一个表达式并告诉你它的类型。这个过程可以反过来:我们递归地创建随机表达式树,同时检查它们是否匹配给定的输入类型。在每个步骤中,我们都会执行推理算法步骤的后退步骤。如果幸运的话,这个搜索会产生一个或多个表达式。
djinn包也从类型表达式生成代码,但支持的类型较少,文档也很少 。但是,与 exference 不同,它保证总是终止。
对于 emacs 用户,似乎djinn 已经集成到 ghc-mod中。
还有luqui的 Djest ,它在 Quickcheck 和以前的工具之间。它允许您输入几组输入和输出,程序将为此尝试并组成一个满足它们的功能。
感谢所有贡献并让我发现这些软件包的人。
推荐阅读
- string - List(Of String) Distinct 有重复项
- cmake - 使用 target_link_libraries 找到打印库完整路径
- reactjs - React setstate 会破坏 Redux 对象吗?
- python-3.x - PPTK,设置相机位置
- sql - 在 Label SQL 中添加点表示法
- php - Carbon 中的 ISO 8601 解析验证
- javascript - 从特定位置替换字符串直到结束Javascript
- javascript - 情感/风格 - 悬停在 SVG 组件上
- c++ - c++中奇怪的语法是什么意思
- python - 如何验证python中的单词?