gpt4 book ai didi

haskell - 为什么实际类型是Double?

转载 作者:行者123 更新时间:2023-12-02 04:08:49 25 4
gpt4 key购买 nike

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. 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. midi x y 中的 y 必须是 Double,因此
  8. freq 必须采用 Double 作为其元组的第二部分。

您可以在该链中的几乎任何步骤中使用 fromIntegral::Int -> Double 来修复问题。立即执行可能是最简单的方法,如下所示

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

关于haskell - 为什么实际类型是Double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53144673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com