我认为,它必须与curring或haskell将fxy转换为(fx)y的基本模型有关
不。它与类型有关(与在Haskell世界中几乎一样)。首先,Num
是一个类型类,而不是一个类型。类型可以是实例一个类型类的,例如Int
,Integer
和Double
是的实例Num
。现在,让我们看一下加号类型:
(+) :: Num a => a -> a -> a
啊哈!它采用type类型的两个参数a
,并返回a
,其中a
需要是的实例Num
(也称为约束)。
现在,我们有足够的信息可以重新访问f3
:
f3_wrong_sig :: Num -> Int -> Num
经过上面的讨论,很明显f3_wrong_sig
签名错误。取而代之的是Num
,它需要a
受以下约束Num
:
f3_wrong_implementation :: Num a => a -> Int -> a
f3_wrong_implementation x y = x + y
但是,如果我们还记得的类型(+)
,x + y
则只能用于a
并且Int
是等效的(也已写成a ~ Int
)。我们需要一种从以下方法创建另一个数字类型的方法Int
:我们需要一个函数Num a => Int -> a
。让我们检查有关Int
GHCi的一些信息:
ghci> :i Int
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in `GHC.Types'
-- omitted
instance Integral Int -- Defined in `GHC.Real'
instance Num Int -- Defined in `GHC.Num'
-- omitted
Int
不仅是的一个实例Num
,而且还是的一个实例Integral
。快速的搜索为我们提供了fromIntegral :: (Integral b, Num a) => b -> a
,我们可以插入它们并最终得到我们想要的东西:
f3 :: Num a => a -> Int -> a
f3 x y = x + fromIntegral y
在这一点上,我们也可以采取最后一步使它变得更加通用,因为它fromIntegral
适用于任何情况 Integral
:
f3_general :: (Integral b, Num a) => a -> b -> a
f3_general x y = x + fromIntegral y
这也是GHC推断的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句