2016-01-13 3 views
3

Есть ли короткий способ изменить возвращаемый тип функции?Изменение возвращаемого типа функции в Haskell?

Рассмотрите напримерcomparing в Data.Ord. Он возвращает Ordering. Тем не менее меня интересует только то, являются ли эти два элемента равными или нет. Поэтому мне нужно преобразовать полученный Ordering в Bool.

прямо вперед, как я могу думать:

isEqualOn f x y = if comparing f x y==EQ then True else False 

(или isEqualOn f x y = comparing f x y==EQ, как здесь, как указано в комментариях).

Есть ли более композиционный способ сделать это (например, адаптировать comparing или написать его бессмысленным образом), не выписывая все? В идеале я ищу что-то, что работает и над n-ary функциями.

- Обновление -

Как было предложено ответы/комментарии, конкретный пример выше (isEqualOn) может быть реализована с использованием стандартного on функцию on (==). Тем не менее, мой вопрос заключается в общей методике изменения типов возвращаемых функций в композиционном/бессмысленном виде, о чем свидетельствует подход SEC в комментариях.

+0

@luqui уверен, что это короче. – tinlyx

+0

О, я удалил его. Для справок в будущем это было 'isEqualOn f x y = сравнение f x y == EQ'. – luqui

+2

И вообще у вас есть функция '(== EQ) :: Ordering -> Bool', и функция, которая дает вам то, где вы находитесь, где вы хотите быть, - это в основном самая композиционная вещь, которую вы можете иметь (хотя вы можете обнаружить, что это необоснованно звучит, пока вам не станет удобнее работать с композицией) – luqui

ответ

5

Ваше определение isEqualOn будет такой же, как on (==):

\> import Data.Function (on) 
\> :t (on (==)) 
(on (==)) :: Eq a1 => (a -> a1) -> a -> a -> Bool 

, например, для сравнения по абсолютной величине:

\> let isEqualOn = on (==) 
\> isEqualOn abs 2 (-2) 
True 
+1

'on' чаще всего записывается как инфикс:' '((==)' on'abs) 2 (-2) ''. Или, конечно, более уместным является пример типа '' groupBy ((==) 'on'abs) [1,2, -2, -3,3,4]' ', который дает' [[1], [ 2, -2], [- 3,3], [4]] '. – leftaroundabout

+0

Спасибо. Но меня интересует общий подход к преобразованию функций. Например, мне может потребоваться вывести «меньше» предиката из «сравнения», изменив тип возврата. :) (Вот почему я использовал полужирный шрифт на «например») – tinlyx

+1

Я думаю о «на» в качестве предлога, поэтому я всегда использую инфикс 'on'; Я бы написал '' (==) 'on' f'' вместо' on (==) f'. – dfeuer

0

Как уже упоминалось вы можете использовать функцию on из Data.Function, но , возможно, вы ищете оператора ==, который возвращает Bool. В этом случае ваша функция может быть записана в виде:

isEqualOn f x y = fx == fy 

и лично я никогда бы не написать эту конкретную функцию, но «инлайн» там, где он используется.

В общем случае «изменение типа возврата». То, что вы ищете состав:

isEq Eq = True 
isEq _ = False 

equal x y = isEq (comparing x y) 

или более Haskell ароматизированные:

equal x = isEq . comparing x 
Смежные вопросы