相关疑难解决方法(0)

为什么这个实现无效?

假设我有以下类型签名:

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对这个实现感到不安?

这个错误很明显:

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
Run Code Online (Sandbox Code Playgroud)

我想我不明白的是它要求"forall" b.使用这个函数的任何代码都应该只依赖于b一个实例Eq,对吧?在我看来,实现确实符合签名.我的实施怎么样打破了这个签名的期望?

haskell types compiler-errors typeclass parametric-polymorphism

5
推荐指数
1
解决办法
93
查看次数

Haskell:通过`fromIntegral`了解类型转换机制

通过了解类型转换 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)

显然fromIntegralInt/ Integer转换为某些Num类类型(哪个?我不知道)。除法中缀运算符期望两个小数作为输入。现在看一下该图,该图总结了Haskell中的标准type-class-relations。

Num在上面Fractional …

haskell types

2
推荐指数
1
解决办法
68
查看次数