我有以下内容:
data Dog =
Dog
{ _x :: Int
}
makeFieldsNoPrefix ''Dog
data Cat =
Cat
{ _dog :: Dog
}
makeFieldsNoPrefix ''Cat
这为我提供了HasX
和HasDog
类以及实例instance HasDog Cat Dog
和instance HasX Dog Int
但我还想生成instance HasX Cat Int
,这个TH功能是否可以在某处使用?
答案 0 :(得分:1)
至少有两个很好的理由makeFields
不会为传递包含的字段生成Has
个实例。
Has
个实例会很慢(O(n ^ 2))。选择x
并不总是显而易见的选择。考虑
data TwoDogs = { _dog1 :: Dog, _dog2 :: Dog }
哪Dog
_x
TwoDogs
HasX
Lens
镜头访问权限?它是Traversal
,而不是HasX
,因此您必须选择一个。期望自动化工具为您做出决定是不合理的。
幸运的是镜头非常容易构图。如果您希望您的类型具有_x
实例,该实例标识嵌套在结构中的特定instance HasX Cat Int where x = dog.x
(根据某些特定于域的规则),您只需编写一个。
Class<?> cls = ClassB.class;
Object obj = cls.newInstance();
(ClassB)obj.setA();
(ClassB)obj.test();