2013-11-30 2 views
0

новичка и сделал этот код в winHugs Haskell, чтобы проверить максимальный показатель к могут быть вызваны, что 2 мощности к является делитель п:Haskell типа Преобразования ошибки

maxexp2 ::Int -> Int 
maxexp2 n 
    | n==0 || 2^k`mod`n /= 0 = 0 
    | otherwise == k 
    where k = e `div` f  
     e = round (fromIntegral(log n)) 
     f = round (fromIntegral (log 2)) 

Как-то я знаю, что есть что-то fishy с частью e и f ... ошибка говорит: для выполнения этой функции необходим фрагмент Int. Я действительно не понимаю, что ... может кто-нибудь, пожалуйста, объясните мне это?

ответ

2

Очевидно, что логарифм почти всех чисел является чем-то иррациональным, поэтому использование fromIntegral на нем действительно должно показаться вам подозрительным. Почему вы думаете, что вам это нужно в этот момент? Где вам нужно это перед тем логарифма, потому что на самом деле также принимает только значения Floating класса, так как мы можем легко узнать :

Prelude>: т войти
журнал :: Floating a => a -> a

Так что это должно быть e = round (log $ fromIntegral n). Это не нужно для f, потому что 2 - всего лишь общий номер Num буквальный, а не Int. Очевидно, однако, не может быть справедливо только roundlog 2, потому что это просто 1. Что вы, возможно, хотите, это round $ e/f с плавающей запятой e и f.


я не знаю, если это работает в Hugs; вероятно. Если нет, используйте GHCi (почему все новые, кажется, используют Hugs в данный момент в любом случае? Я не знаю, почему вы использовали бы что-нибудь другое, кроме GHC).

Смежные вопросы