我不理解以下代码的简单类型错误
addCustom :: Num a => a -> a
addCustom a = a + 1.2
它抛出
无法推断(部分a)由文字“ 1.2”引起的
,我不知道为什么。
答案 0 :(得分:7)
您的类型签名
var tr = document.createElement('tr');
tr.append(createElementWithText('td', userName), createElementWithText('td', userEmail), createElementWithText('td', userPassword));
appendingTo.appendChild(tr);
声明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 :(得分:4)
您必须将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
这就是为什么添加该上下文可以解决该问题。