假设我有以下类型签名:
someFunction :: (Eq a, Eq b) => a -> b
Run Code Online (Sandbox Code Playgroud)
实施:
someFunction x = (2 :: Int)
Run Code Online (Sandbox Code Playgroud)
(不要把它放得太远,这只是一个例子).
我对签名的理解是" someFunction接受一个作为Eq类型类的实例的参数,并返回一个值(可以是不同类型),它是Eq类型类的实例".Int是一个实例Eq,为什么GHC对这个实现感到不安?
这个错误很明显:
Run Code Online (Sandbox Code Playgroud)Couldn't match expected type ‘b’ with actual type ‘Int’ ‘b’ is a rigid type variable bound by the type signature for: someFunction :: forall a b. (Eq a, Eq b) => a -> b
我想我不明白的是它要求"forall" b.使用这个函数的任何代码都应该只依赖于b一个实例Eq,对吧?在我看来,实现确实符合签名.我的实施怎么样打破了这个签名的期望?
haskell types compiler-errors typeclass parametric-polymorphism
fromIntegral因此,最近我遇到了很多类型转换错误。这使我开始使用fromIntegral,尽管我对它的工作方式感到困惑。
minimalExample :: Integer -> Integer
minimalExample a = truncate y
where
x = fromIntegral (a + 10)
y = x - 12 * (x / 13)
Run Code Online (Sandbox Code Playgroud)
请注意,我必须使用fromIntegral哪种方式确保操作员的x类型正确(/)。如果x是Integral类型,那将行不通。对GHCI中的函数进行类型检查会得到以下信息:
Prelude> :t fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)
显然fromIntegral将Int/ Integer转换为某些Num类类型(哪个?我不知道)。除法中缀运算符期望两个小数作为输入。现在看一下该图,该图总结了Haskell中的标准type-class-relations。
Num在上面Fractional …