Haskell拉链

Sor*_*run 6 haskell ghci zipwith

我想总结一个压缩列表。

averageGrade :: [Float] -> [Int] -> Float
averageGrade [0.75 , 0.25] [6, 4] , result: 0,75*6 + 0.25*4 = 5.5 
Run Code Online (Sandbox Code Playgroud)

当我去ghci并执行以下操作时:

sum(zipWith (*) [0.75, 0.25] [6, 4])
Run Code Online (Sandbox Code Playgroud)

我确切地得到了我想要的。

但是在代码中我遇到了一个错误,我也不知道为什么。

    averageGrade :: [Float] -> [Int] -> Float
    averageGrade a b
                | a == [] = 0
                | b == [] = 0
                | otherwise = (sum(zipWith (*) a b))
Run Code Online (Sandbox Code Playgroud)

如果要编译此文件,则会出现以下错误:

Couldn't match type ‘Int’ with ‘Float’
Expected type: [Float]
  Actual type: [Int]
In the third argument of ‘zipWith’, namely ‘b’
In the first argument of ‘sum’, namely ‘(zipWith (*) a b)’
Failed, modules loaded: none.
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 6

您不能输入*两个具有不同类型的数字,例如FloatInt。您需要显式转换其中之一,以便它们具有相同的类型(Float在您的情况下为)。

averageGrade :: [Float] -> [Int] -> Float
averageGrade a b
            | a == [] = 0
            | b == [] = 0
            | otherwise = sum (zipWith (\ x y -> x * fromIntegral y) a b)
Run Code Online (Sandbox Code Playgroud)

请注意,您实际上并不需要检查==[]案例,因为zipWithreturn []是那些案例,而sum [] == 0

averageGrade :: [Float] -> [Int] -> Float
averageGrade a b = sum (zipWith (\ x y -> x * fromIntegral y) a b)
Run Code Online (Sandbox Code Playgroud)

  • 我认为值得补充为什么sum(zipWith(*)[0.75,0.25] [6,4])在GHCi中起作用的原因-即整数常量6和4是多态的,而GHC是将它们解释为“浮点数”(或者可能是“双精度数”,不确定默认值),因此表达式会进行类型检查。问题来自类型签名,这意味着您试图为((*)`提供两种不同的类型。 (2认同)