繁体   English   中英

Haskell中的newtype行为

[英]newtype behaviour in Haskell

我发现我可以做1 :: Product Int并得到Product {getProduct = 1}

Productnewtype定义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或某个东西上? 为什么这不起作用?

当且仅当TNum的实例时,您可以执行1 :: T 1 :: Product Int起作用,因为Product定义了一个实例instance Num a => Num (Product a) (即如果aNum的实例,则Product a也是Num的实例)。

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

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

您可以手动(使用instance )或使用deriving NumGeneralizedNewtypeDeriving扩展来自动执行此操作,这将为Num a => Stuff a定义Num实例Num a => Stuff a与给定aNum实例完全相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM