【发布时间】:2019-01-13 02:41:58
【问题描述】:
我不理解以下代码的简单类型错误
addCustom :: Num a => a -> a
addCustom a = a + 1.2
它抛出
无法从文字“1.2”推导出(小数a)
我不知道为什么。
【问题讨论】:
我不理解以下代码的简单类型错误
addCustom :: Num a => a -> a
addCustom a = a + 1.2
它抛出
无法从文字“1.2”推导出(小数a)
我不知道为什么。
【问题讨论】:
你的类型签名
addCustom :: Num a => a -> a
声明 addCustom 适用于所有数字类型 a,包括例如整数。
但是addCustom (0 :: Integer) 会出错:a + 1.2 不能用整数运算完成,因为1.2 不是整数值(它是小数)。
所以你需要做的就是改变你的函数体:
addCustom a = a + 1
(因为1存在于所有数字类型中)或更改类型签名:
addCustom :: Fractional a => a -> a
(它限制了addCustom,因此它只能用于小数类型,其中1.2 是一个有效值)。
【讨论】:
您必须将Fractional a 添加到a 的上下文中。
addCustom :: (Fractional a) => a -> a
addCustom a = a + 1.2
应该可以。
如果您启动 ghci 并查看 1.2 的类型,您会看到
(1.2) :: Fractional p => p
而(+)的类型是
(+) :: Num a => a -> a -> a
里面说函数可以应用到属于类型类Num的那个。
所以虽然a -> a 是您的函数的类型,但它没有Fractional 的上下文。仅限Num
这就是为什么添加该上下文可以解决问题。
【讨论】:
Fractional is a subset of Num,所以我认为你可以省略对Num的约束。