Haskell类型说明

时间:2019-01-12 14:29:50

标签: haskell types

我不理解以下代码的简单类型错误

addCustom :: Num a => a -> a
addCustom a = a + 1.2

它抛出

  

无法推断(部分a)由文字“ 1.2”引起的

,我不知道为什么。

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

这就是为什么添加该上下文可以解决该问题。