[英]newtype behaviour in Haskell
我发现我可以做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
约束放在a
或某个东西上? 为什么这不起作用?
当且仅当T
是Num
的实例时,您可以执行1 :: T
1 :: Product Int
起作用,因为Product
定义了一个实例instance Num a => Num (Product a)
(即如果a
是Num
的实例,则Product a
也是Num
的实例)。
我是否必须将Num约束放在某个或某个东西上?
你必须为Stuff Int
定义一个Num
实例(或者更好地为Num a => Stuff a
)。
您可以手动(使用instance
)或使用deriving Num
和GeneralizedNewtypeDeriving
扩展来自动执行此操作,这将为Num a => Stuff a
定义Num
实例Num a => Stuff a
与给定a
的Num
实例完全相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.