我发现我可以执行此操作ActivityOptionsCompat.makeSceneTransitionAnimation
并获得1 :: Product Int
作为结果。
Product {getProduct = 1}
是Product
中定义的newtype
。比我尝试定义自己的Data.Monoid
一样:
newtype
但如果我尝试newtype Stuff a = Stuff {getStuff :: a} deriving (Show)
,我会收到错误:
1 :: Stuff Int
我是否必须在<interactive>:20:1: error:
* No instance for (Num (Stuff Int)) arising from the literal `1'
* In the expression: 1 :: Stuff Int
In an equation for `it': it = 1 :: Stuff Int
或其他内容上设置Num
约束?为什么这不起作用?
答案 0 :(得分:15)
当且仅当1 :: T
是T
的实例时,您才能Num
。 1 :: Product Int
有效,因为Product
定义了一个实例instance Num a => Num (Product a)
(即如果a
是Num
的实例,Product a
也是Num
的实例1}})。
我是否必须将Num约束放在某个或某个东西上?
您必须为Num
定义Stuff Int
个实例(或Num a => Stuff a
更好)。
您可以手动(使用instance
)或自动使用deriving Num
和GeneralizedNewtypeDeriving
扩展程序执行此操作,这将为Num
定义Num a => Stuff a
个实例其行为与给定Num
的{{1}}实例完全相同。