谁能解释为什么这两个都快乐地编译:
data A a b = A { a :: a, b :: b }
newtype B a = B (A a (B a))
newtype C = C (A Int C)
Run Code Online (Sandbox Code Playgroud)
但我不能通过类型同义词创建类似的递归定义类型?
type B a = A a (B a)
type C = A Int C
Run Code Online (Sandbox Code Playgroud)
虽然显然data B a = A { a :: a, b :: B a }
效果很好.
有没有办法避免处理那个额外的构造函数X,我希望类型递归?我主要传递的是访问器功能,b
无论如何都要选择,所以我很好,但如果存在简单的规避机制,我想知道它.
我应该用什么编译指示来提高专用数据类型C的性能?只是专攻东西?
在没有复制记录两次的情况下复制A a b
和A c d
定义a -> b
和c …
是否有任何最新的 Prolog 实现基准(带有结果)?
我在汞网站上找到了这个。令人惊讶的是,它显示了swi-prolog和 Aquarius之间的 20 倍差距。我怀疑这些结果已经很老了。这个差距还成立吗?就我个人而言,我还希望看到一些与启用发生检查的比较,因为它对性能有重大影响,并且某些编译器在优化它方面可能比其他编译器更好。
最近比较,我发现这个要求是GNU的序言是2X比SWI更快,YAP为4x比SWI快于一个特定的代码库。
编辑:
实际问题需要发生检查的特定情况
当然:在 Haskell、OCaml、Swift或定理证明器(例如this one)中进行类型推断。我还认为程序员有责任证明他的代码不需要发生检查。测试只能证明你确实需要它,而不是你不需要它。