1
2
我对玩具示例进行了基准测试,没有发现这两种方法之间的性能差异,但使用情况确实有点不同。
其中不同的特定newtypes之间的内部表示相同的事实是透明的。 类型标记方法几乎总是伴随着表示构造函数隐藏,
部分原因是你需要一些语法上的轻松方式来指示你想要的标签。如果您没有提供智能构造函数,那么客户机代码通常会选择类型注释来缩小范围,例如。,
|
2
3
还有另一个简单的方法。
我认为,如果你想在任何频率下使用你的普通类型“裸体”,并且只是有时想标记它,那么这些方法会更好。另一方面,如果您通常希望使用带标记的方法,那么幻像类型方法更直接地表达您想要的内容。 |
3
1
首先,它迫使许多函数具有不必要的多态性——即使在实践中每个实例对不同的包装器执行相同的操作,类型类的开放世界假设意味着编译器必须考虑其他实例的可能性。虽然GHC肯定比一般的编译器更聪明,但是你能提供的信息越多,它就越能帮助你。 第二,这会为更复杂的数据结构造成瓶颈。包装类型上的任何泛型函数都将被约束到类型类提供的接口,因此除非该接口在表达性和效率方面都是详尽的,否则您可能会遇到使用该类型的算法出现问题,或者在发现缺少的功能时重复更改类型类的风险。
另一方面,如果包装的类型已经保持抽象(即,它不导出构造函数),那么瓶颈问题是不相关的,因此类型类可能是有意义的。否则,我可能会使用幻影类型标记(或者可能是标识)
|
trpnd · 如何定义由两个任意单声道变压器组成的单声道变压器? 2 年前 |
Fabus1184 · Haskell mapM_不打印 2 年前 |
Gotthold · 基于范数约束向量的类型 2 年前 |
jian · haskell将另一个函数用作输入参数 2 年前 |
Jocafrei · 用Haskell函数实现最大公约数函数 6 年前 |