Haskell中的newtype行为

时间:2016-08-08 13:12:12

标签: haskell newtype

我发现我可以执行此操作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约束?为什么这不起作用?

1 个答案:

答案 0 :(得分:15)

当且仅当1 :: TT的实例时,您才能Num1 :: Product Int有效,因为Product定义了一个实例instance Num a => Num (Product a)(即如果aNum的实例,Product a也是Num的实例1}})。

  

我是否必须将N​​um约束放在某个或某个东西上?

您必须为Num定义Stuff Int个实例(或Num a => Stuff a更好)。

您可以手动(使用instance)或自动使用deriving NumGeneralizedNewtypeDeriving扩展程序执行此操作,这将为Num定义Num a => Stuff a个实例其行为与给定Num的{​​{1}}实例完全相同。