如何要求GHCI解释以下原因:
*Lib> sum Nothing
0甚至编译?有没有和Monoid有牵连?这不在签名里!
*Lib> :i Foldable
class Foldable (t :: * -> *) where
...
maximum :: Ord a => t a -> a
minimum :: Ord a => t a -> a
sum :: Num a => t a -> a
product :: Num a => t a -> a
-- Defined in ‘Data.Foldable’
instance Foldable [] -- Defined in ‘Data.Foldable’
instance Foldable Maybe -- Defined in ‘Data.Foldable’
instance Foldable (Either a) -- Defined in ‘Data.Foldable’
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
*Lib> :i Num
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
-- Defined in ‘GHC.Num’
instance Num Word -- Defined in ‘GHC.Num’
instance Num Integer -- Defined in ‘GHC.Num’
instance Num Int -- Defined in ‘GHC.Num’
instance Num Float -- Defined in ‘GHC.Float’
instance Num Double -- Defined in ‘GHC.Float’
*Lib> sum Nothing
0发布于 2015-11-04 06:16:13
您可以使用键入的孔:
> sum (Nothing :: _)
<interactive>:4:17:
Found hole `_' with type: Maybe a
Where: `a' is a rigid type variable bound by
the inferred type of it :: Num a => a at <interactive>:4:1
To use the inferred type, enable PartialTypeSignatures
Relevant bindings include it :: a (bound at <interactive>:4:1)
In an expression type signature: _
In the first argument of `sum', namely `(Nothing :: _)'
In the expression: sum (Nothing :: _)这说明a是一个严格类型的变量,由it :: Num a => a的推断类型绑定,并且由于Maybe是Foldable的一个实例(正如您已经在输出到:i Foldable中看到的那样,尽管您也可以在到:i Maybe的输出中看到),它将假定Nothing :: Num a => Maybe a进行编译,因为sum对它施加了Num约束。
所以它编译的原因是,sum接受一个包含代码值的代码,而Maybe是一个代码,Nothing本身具有类型Maybe a,并且sum对a必须实现< Num a => a >d19Foldable >进行了约束。在GHCi中时,默认设置为Integer,因此您可以看到0的输出。
https://stackoverflow.com/questions/33509984
复制相似问题