我在Haskell中遇到了关于建模继承的这个问题,它提醒我,我有一个更复杂的版本同样的问题.我将从那里采用这个例子,因为它比思考我自己更容易.
假设您的程序包含多种类型:
data Camera = Camera ...
data Light = SpotLight ... | DirectionalLight ...
data Object = Monster ... | Player ... | NPC ...
Run Code Online (Sandbox Code Playgroud)
现在你想要实现一些基本的物理,所以你希望它们都具有位置和速度,比如某种类型Vec3.
执行此操作的一种方法是Physical使用pos和vel函数声明类型类,并为其创建所有类型的实例.但这意味着你必须修改所有类型以包含两个Vec3s,如果你已经定义了很多很好的类型,那么这很烦人,而你只想在顶部粘合一些功能.Chris Taylor提出的基于镜头的解决方案也有同样的问题.
一个对我来说更整洁的解决方案是声明一个新类型的构造函数,
data Physical a = Physical a Vec3 Vec3
Run Code Online (Sandbox Code Playgroud)
然后你只需要执行pos,vel以及Functor实例一次,你得到所有现有的类型声明.
但是......这并不是很好.如果您现在希望能够将对象绘制为蓝色或绿色或紫色,则可能需要使用颜色执行相同操作:
data Coloured a = Coloured a Colour
Run Code Online (Sandbox Code Playgroud)
但是现在,如果你有一个Coloured Physical Camera,你必须fmap一个不同的次数取决于您是否想看看它的颜色和它的位置,或者它的焦距.和a Coloured Physical Camera应该是一样的Physical Coloured …
您可能已经注意到,在较新版本的matlab中,边界函数(计算一组2d或3d点的边界)已得到改进.
现在可以给函数一个名为'shrink factor'的参数.如果收缩因子为0,则跟踪的边界是传统的凸包.当收缩参数更大时,边界更加收缩.如果未指定任何值,则缩小系数的默认值为0.5.
所以,我理解它的用途和它的作用(实际上我已经在项目中使用过该函数),但我不知道它是如何工作的.这种收缩系数的几何原理是什么?
谢谢!