【发布时间】:2021-05-28 20:33:07
【问题描述】:
我对 Haskell 中的类感到困惑,如下所示。
我可以定义一个接受 Integral 参数的函数,并成功地为其提供 Num 参数:
gi :: Integral a => a -> a
gi i = i
gin = gi (3 :: Num a => a)
我可以定义一个接受 Num 参数的函数,并成功地为其提供一个 Integral 参数:
fn :: Num a => a -> a
fn n = n
fni = fn (3 :: Integral a => a)
我可以定义一个 Integral 值并为其分配一个 Num
i :: Integral a => a
i = (3 :: Num a => a)
但是,如果我尝试定义一个 Num 值,那么如果我为其分配一个 Integral 值,则会出现解析错误
- this doesn't work
n :: Num a => a
n = (3 :: Integral a => a)
也许我对我的 OO 背景感到困惑。但是为什么函数变量似乎让你“双向”,即可以在“预期”超类时提供子类的值,并且可以在预期子类时提供超类的值,而在值赋值中你可以提供将超类赋值给子类值,但不能将子类赋值给超类值?
作为比较,在 OO 编程中,您通常可以将子值分配给父类型,但反之则不行。在 Haskell 中,第二对示例中的情况似乎正好相反。
【问题讨论】:
-
您是否真的收到了 parse 错误,或者您收到的错误是
Could not deduce (Integral a) arising from an expression type signature from the context: Num a? -
当你创建
gin和fni,然后用:t检查它们的类型,你看到了什么?
标签: haskell