Я написал функцию для преобразования вейвлеров Haar, учитывая, что вход представляет собой список с мощностью 2. Я пытался проверить ошибку, убедившись, что длина списка является силой 2 перед формованием трансформации. Я сравниваю лог-базу 2 длины списка, чтобы увидеть, получится ли она равномерно (ничего справа от десятичной точки). Я думаю, что что-то происходит с утверждением if в haskell, что я не привык на других языках. Он отлично работает, если я не проверяю ошибки и просто вызываю хаар с правильным аргументом.Оператор Haskell для проверки ошибок
haar :: (Fractional a) => [a] -> [a]
haar xs = if logBase 2 (fromIntegral (length xs)) /= truncate (logBase 2 (fromIntegral (length xs)))
then error "The List must be a power of 2"
else haarHelper xs (logBase 2 (fromIntegral (length xs)))
haarHelper xs 1 = haarAvgs xs ++ haarDiffs xs
haarHelper xs level = haarHelper (haarAvgs xs ++ haarDiffs xs) (level - 1)
haarAvgs [] = []
haarAvgs (x:y:xs) = ((x + y)/2.0) : haarAvgs xs
haarDiffs [] = []
haarDiffs (x:y:xs) = ((x - y)/2.0) : haarDiffs xs
Я получаю следующее сообщение об ошибке:
functions.hs:52:13:
Ambiguous type variable `t' in the constraints:
`Floating t'
arising from a use of `logBase' at functions.hs:52:13-48
`Integral t'
arising from a use of `truncate' at functions.hs:52:53-99
Probable fix: add a type signature that fixes these type variable(s)
Failed, modules loaded: none.
Знаете ли вы, что эта реализация будет иметь крайне низкую производительность для списков какой-либо значительной длины? –