Я пытаюсь сделать проблему 9 Project Euler прямо сейчас, но Haskell не перестанет кричать на меня о типах, которые не совпадают. Дело в том, что ghci говорит мне, что он ожидает типов, отличных от тех, которые указаны в определениях типа функции.Ожидающие типы не совпадают с определениями типов
Вот код:
solvePyth :: Int -> Int -> Float
solvePyth x y
|valid = x * y * z
|otherwise = if y < x then solvePyth x (y + 1) else solvePyth (x + 1) 1
where z = sqrt $ fromIntegral $ x^2 + y^2
valid = (x^2 + y^2 == z^2) && (x + y + z == 1000)
и вот ошибки я получаю:
Prelude> :l debug
[1 of 1] Compiling Main (debug.hs, interpreted)
debug.hs:3:14:
Couldn't match expected type `Float' with actual type `Int'
In the first argument of `(*)', namely `x'
In the first argument of `(*)', namely `x * y'
debug.hs:3:18:
Couldn't match expected type `Float' with actual type `Int'
In the second argument of `(*)', namely `y'
In the first argument of `(*)', namely `x * y'
debug.hs:6:33:
Couldn't match expected type `Int' with actual type `Float'
In the first argument of `(^)', namely `z'
In the second argument of `(==)', namely `z^2'
Failed, modules loaded: none.
То, что я не понимаю, почему (*)
и (^)
ожидают поплавки и Ints, когда проверка их ввода в ghci с :t
показывает, что их аргументы нужно рассматривать только Nums.
Тип '*' например: 'Num a => a -> a -> a' - вы правы, что он принимает любой экземпляр' Num', однако он принимает только один тип за раз, и возвращает тот же тип. Выражение 'x * y * z' имеет тип' Int', или оно не хорошо напечатано, потому что вы объявили 'x' иметь тип' Int'. Однако вы возвращаете float. Просто добавьте другой 'fromIntegral $ x * y * z'. – user2407038
вам также нужно «закруглить» уравнение 'z', тогда вы можете установить тип результата на' Int' – epsilonhalbe