当我编译时,我收到以下错误消息:
重复的类型签名:
WeightedMedian.hs:71:0-39: findVal :: [ValPair] -> 双 -> 双
WeightedMedian.hs:68:0-36: findVal :: [ValPair] -> Int -> Double
我的解决方案是使用 findValI 和 findValD。然而,findValI 只是将 Int 类型转换为 Double 并调用 findValD。
另外,我无法对 Num (Int, Double) 类型进行模式匹配,因此我不能将类型签名更改为
findVal :: [ValPair] -> Num -> Double
在许多语言中,我不需要不同的名称。为什么我在 Haskell 中需要不同的名称?这很难添加到语言中吗?或者那里有龙吗?
Haskell 中通过类型类提供临时多态性(和名称重载):
class CanFindVal a where
findVal :: [ValPair] -> a -> Double
instance CanFindVal Double where
findVal xs d = ...
instance CanFindVal Int where
findVal xs d = findVal xs (fromIntegral d :: Double)
请注意,在这种情况下,因为findVal
“真的”需要一个Double
,我总是让它采用双精度,当我需要传递一个 int 时,只需使用fromIntegral
在呼叫站点。当实际上涉及不同的行为或逻辑时,而不是混杂地,您通常需要类型类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)