我有一个问题,我想了解更多,以及如何避免。我有这个代码
len :: (Num r ) => [a] -> r
len [] = 0
len xs = 1 + len ( tail xs )
avg :: (Num t) => [t] -> Double
avg xs = ( sum xs ) / ( len xs )
这会导致以下错误
len.hs:6:9: 无法将预期类型“Double”与推断类型“t”匹配 `t' 是一个刚性类型变量,由 len.hs:5:12 处“avg”的类型签名 在表达式中:(sum xs) / (len xs) 在 `avg' 的定义中:avg xs = (sum xs) / (len xs)
现在,我知道这个错误(感谢 irc.freenode.net#haskell)是除法函数的结果
(/) :: (Fractional a) => a -> a -> a
但是,我不知道该怎么做。我的avg
函数签名应该与除法运算符的怪癖(需要类型类)无关Fractional
。所以,我认为克服这个问题的正确方法是通过强制转换为隐含他们类型类的类型,Fractional
但我不知道如何,或者即使这是正确的?有任何想法吗?