我发现我可以做到这一点1 :: Product Int并得到Product {getProduct = 1}结果.
Product是一个newtype定义的Data.Monoid.比我尝试定义自己的newtype那样:
newtype Stuff a = Stuff {getStuff :: a} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
但如果我尝试这样做,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
Run Code Online (Sandbox Code Playgroud)
我是否必须施加Num约束a或什么?为什么这不起作用?
sep*_*p2k 15
1 :: T当且仅当if T是一个实例时,你可以这样做Num.1 :: Product Int因为Product定义了一个实例instance Num a => Num (Product a)(即if a是一个实例Num,Product a也是一个实例Num).
我是否必须将Num约束放在某个或某个东西上?
您必须Num为Stuff Int(或更好Num a => Stuff a)定义实例.
您可以手动(使用instance)或自动使用deriving Num和GeneralizedNewtypeDeriving扩展来执行此操作,扩展将Num为该操作定义一个与给定实例Num a => Stuff a完全相同的Num实例a.