在haskell中表达式的类型注释中使用类别的班级约束无法正常工作。 我目前正在学习表达式和类型的Haskell Newbie。我最近了解到,在Haskell中指定类型时,可以使用类约束。为了实验,我很高兴...

问题描述 投票:0回答:1
我不明白为什么该表达式

a == 5

没有任何错误而起作用。变量A具有类型
Num a => a
,并且由于

Num

类并未定义
(==)
函数,因此我期望类型误差。
有人可以解释为什么这有效吗?
    

ghci

将临时尝试将类型分配给

a
haskell types typeclass type-constraints
1个回答
0
投票

a = 3 :: Num a => a

您实际上写了类似的东西:
a = fromInteger 3
因此,可以专门针对

Integer
Double

等。

a == 5
的背景下,它要求

a

必须为
(Num a, Eq a) => a
它将执行dype默认设备,因此在情况下使用

Integer

。因此,它检查了:

fromInteger 3 == fromInteger 5
专业两者至
Integer
,然后在这些方面运行

(==)

函数。 Haskell中的型与Java中的内容有点“相反”。如果在Java中,您可以写:

MyInterfacefoo;

这意味着我们只知道
foo
是一个实例。 如果我们写的话,请在Haskell中进行:

MyInterface
意味着
x :: Num a => a

是一种类型

x

a

Num a

。如果我们以后在其他上下文中使用
x
,则可能需要额外的类型约束。
如果因此我们写一个函数:

eq5 :: (Num a, Eq a) => a -> Bool eq5 x = x == 5

因此,haskell承诺它将适用于所有类型
a

Num a

Eq a
满足的所有类型。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.