2013-11-28 2 views
0

мне нужно выяснить, если разница от differenceAB является наименьшим:операторы сравнения вызовов в Haskell

smallestDifference3 :: Int -> Int -> Int -> Int 
smallestDifference a b c 
    | differenceAB < differenceBC < differenceAC = differenceAB 
    | otherwise = differenceAB 
    where differenceAB 
     | a < b = -(a - b) 
     | otherwise = a - b 
     differenceBC 
     | b < c = -(b - c) 
     | otherwise = b - c 
     differenceAC 
     | a < c = -(a - c) 
     | otherwise = a - c 

, но я получаю эту ошибку:

cannot mix `<' [infix 4] and `<' [infix 4] in the same infix expression 

, как решить мою проблему? кто-нибудь знает? Привет!

+0

Я полностью перестроил ваш вопрос. Наверное, немного экстремальное редактирование, но ваши предыдущие обновления, к сожалению, перестали понимать исходный вопрос. Также исправлена ​​эта другая проблема, касающаяся функций 'differenceAB' и т. Д.. – leftaroundabout

ответ

5

Здесь есть пара проблем.

У вас есть 3 точно идентичных функции. Возможно, вы хотите значения:

smallestDifference a b c = .... 
    where 
    diffAC = abs(a-c) 
    diffAB = abs(a-b) 
    diffBC = abs(b-c) 

Теперь для выражения, вы не можете писать

diffAC < diffAB < diffBC 

< (так) не является ассоциативным оператором. Это значит, вы должны написать явные скобки:

(diffAC < diffAB) < diffBC 

Но это оленья кожа проверить тип, потому что для второго (<) с левой стороны является Bool, но правая рука Int. Что вы хотите

(diffAC < diffAB) && (diffAB < diffBC) 

т.е. если переменный ток ниже, то абы и аб ниже, чем до н

+0

спасибо за ответ, но я получаю сообщение об ошибке: «Посмотрите на Update» – user2999787

+1

@ user2999787: это из-за вашей другой проблемы: 'differenceAB' и т. Д. Не должны быть функциями, а локальными значениями, как уже объяснил Инго. – leftaroundabout

+0

, поэтому мне нужно удалить три функции и добавить вместо них локальное значение? – user2999787

1

Там нет такого понятия, как цепочки операторов в Haskell. Вы должны использовать явные логические операции:

smallestDifference3 :: Int -> Int -> Int -> Int 
smallestDifference a b c 
    | (differenceAB < differenceBC) && (differenceBC < differenceAC) = differenceAB 
    | otherwise = differenceAB 

Кстати, ваш код странно, вы возвращаетесь differenceAB из обоих защитных положений. Непонятно, чего вы хотите достичь, поэтому я не могу помочь дальше.

+0

i updated, я хочу вернуть результат функции, знаю, что я имею в виду? – user2999787

+0

Я хочу ввести команду ghci: «smallestdifference3 1 5 19» и вывести наименьшую разницу этих трех (1 5 19) целых чисел:/вы знаете? – user2999787

2

Если вы просто хотите найти наименьшую разницу, следующая работа будет работать.

smallestdiff a b c = minimum [abs $ a-b, abs $ b-c, abs $a-c]

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