为什么实际类型是Double?

时间:2018-11-04 19:39:21

标签: haskell

fromNotes :: [(Char, Int)] -> [Double]
fromNotes = map freq
  where
    freq (x,y) =  440 * 2**((midi x y - midi 'A' 4)/12)
    midi c o = o * 12 + getIndex c s 0 + 12
    s = "CcDdEFfGgAaB"
    getIndex c (x:xs) i
            | c == x    = i
            | otherwise = getIndex c xs (i+1)

代码给出错误:

* Couldn't match type `Int' with `Double'
Expected type: [(Char, Int)] -> [Double]
Actual type: [(Char, Double)] -> [Double]

据我所知,问题出在midi x y - midi 'A' 4中。

但是Haskell为什么说实际类型是Double?

1 个答案:

答案 0 :(得分:8)

  1. fromNotes返回一个[Double],所以
  2. freq必须返回Double,所以
  3. 2**((midi 'A' 4 - midi x y)/12)必须是Double,所以
  4. midi必须返回Double,所以
  5. o * 12必须是Double,所以
  6. midi的第二个参数必须为Double,所以
  7. y中的midi x y必须是Double,所以
  8. freq必须将Double作为其元组的第二部分。

您几乎可以在该链中的任何步骤使用fromIntegral :: Int -> Double来解决问题。立刻完成操作可能是最简单的,例如

freq (x, y) = ... midi x (fromIntegral y) ...