Я пытаюсь написать функцию, которая проверяет, является ли квадратный корень числа целым или нет. Моя функция выглядит следующим образом:Haskell Нет экземпляра для ... возникающего
check :: [Int] -> [Int]
check xs = filter (\n -> n == round sqrt n) xs
И сообщения об ошибках, я получаю следующие:
No instance for (Integral (Int -> Int))
(maybe you haven't applied enough arguments to a function?)
arising from a use of "round"
In the second argument of "(==)", namely "round sqrt n"
...
No instance for (Floating a0) arising from a use of `sqrt'
The type variable `a0' is ambiguous
Note: there are several potential instances:
instance Floating Double -- Defined in `GHC.Float'
instance Floating Float -- Defined in `GHC.Float'
In the first argument of `round', namely `sqrt'
Edit: Я в конечном итоге переписывать весь вопрос, я надеюсь, что это еще не проблема!
Вы хотите 'round (sqrt n)', а не 'round sqrt n'. Также вам нужно, чтобы из Integral в правом выражении. Итак, 'check = filter (\ n -> n == fromIntegral (round (sqrt n))) – pdexter
Не вызывает ли функция право-ассоциативный? Кроме того, я все еще получаю два сообщения об ошибках: 'Нет экземпляра для (RealFrac Int), возникающего из-за использования« round »' 'Нет экземпляра для (Floating Int), возникающего из-за использования« sqrt »' – DQQpy
Удалите ' [Int] -> [Int] ', вы хотите' [Double] -> [Double] 'например. Если вы действительно хотите «Int», вам нужно дополнительно изменить определение. Вызовы функций лево-ассоциативные. – pdexter