【发布时间】:2010-12-21 11:31:12
【问题描述】:
我遇到了一个我想了解更多信息以及如何避免的问题。我有这个代码
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 typeclass 的类型,但我不知道如何,或者即使这是正确的?有什么想法吗?
【问题讨论】:
标签: haskell types division typeclass