У меня проблема с Haskell, где, похоже, не нравится тот факт, что я возвращаю булево утверждение из вспомогательной функции , Я проверяю, является ли расстояние между двумя числами в списке очень маленьким (менее 0,01); и в случае, когда это правда, я возвращаю это число. В случае, когда он является ложным, я проверяю следующие два числа в списке.Не удалось совместить ожидаемый тип «Bool» с фактическим типом '(a, a)'
Код:
positionChecker Pos ns = if compareDistance(ns !! Pos, ns !! (Pos+1))
then Pos
else positionChecker(Pos+1) ns
compareDistance n1 n2 = if abs(n1 - n2) < 0.01
then True
else False
(NB: Я удалил код предшествующего, который строит список и вызывает positionChecker, инициализацией его с позицией 0 и список номеров)
Выше возвращая следующую ошибку;
pchk.hs:9:49:
Couldn't match expected type ‘Bool’ with actual type ‘(a, a)’
Relevant bindings include
ns :: [a] (bound at pchk.hs:9:21)
positionChecker' :: Int -> [a] -> a (bound at pchk.hs:9:1)
In the first argument of ‘compareDistance’, namely
‘(ns !! Pos, ns !! (Pos + 1))’
In the expression:
compareDistance (ns !! Pos, ns !! (Pos + 1))
In the expression:
if compareDistance (ns !! Pos, ns !! (Pos + 1)) then
ns !! (Pos + 1)
else
positionChecker' (Pos + 1) ns
Опять же, от того, что я могу это сделать, Haskell, кажется, смущает тот факт, что compareDistance возвращается тип Bool.
Я понимаю, что есть гораздо более разумные подходы к этому решению (включая простые, однофункциональные или однострочные решения); но я просто пытаюсь понять эту ошибку, чтобы я мог узнать, где я ошибаюсь в этом типе подхода к проблеме.
Правило № 1: Всегда добавляйте тип функции. Типы помогут вам и задокументируют ваш код. – Shoe
Почему не 'compareDistance' просто:' compareDistance n1 n2 = abs (n1 - n2) <0.01'? – Shoe