2015-02-19 2 views
3

Итак, я читал руководство Haskell онлайн и просто интересовался комбинацией операторов инфикса и фильтра.Путаница на частично применяемых операторах инфикса

Скажите у вас есть функция, как

filter (>5) [6, 10, 5] 

Это будет возвращать [6,10], который, кажется, как интуитивный способ фильтр должен работать.

Однако, делая

filter ((>) 5) [6, 10, 5] 

возвращает пустой список (это по-прежнему имеет смысл, (>) проверяет, является ли ее первый аргумент больше второго аргумента).

Однако, фильтр обычно определяется что-то вроде

filter :: (a -> Bool) -> [a] -> [a] 
filter _ [] = [] 
filter p (x:xs) 
    | p x  = x : filter p xs 
    | otherwise = filter p xs 

Когда система типов знает, что это имеет оператор инфиксный, являются большинство из этих инфиксных операторов, написанных таким образом, что частично применяются функция должна ведущий аргумент к оригиналу префикс? т.е. это инфикс> определяется как что-то вроде (разделывали синтаксис)

infix> :: Int -> Int-> Bool 
infix> x y = (>) y x 
x infix> y = (>) x y 

Извините, если этот вопрос не имеет смысла, я чувствую, что я что-то основное в отсутствии как точки вычисляются, когда р является частично приложенным инфикс оператор.

ответ

10

(>5) и ((>) 5) - это два разных типа выражения.

Первый - это то, что известно как раздел. Разделы имеют вид (op exp) или (exp op), где op является оператором инфикс и exp является еще одним выражением. Раздел принимает аргумент и применяет его к недостающей стороне, поэтому (>5) 4 = (4 > 5) и (5>) 4 = (5 > 4). Другими словами, (>5) эквивалентен \x -> x > 5.

В ((>) 5), (>) является оператором infix >, преобразованным в выражение. ((>) 5), то это приложение 5 к функции (>), которая дает новую функцию, которая принимает следующий аргумент. Если применить этот аргумент, например, (>) 5 4, мы получим префикс эквивалент (5 > 4).

Это преобразование оператора infix в выражение, которое может использоваться префикс, работает для всех инфиксных операторов. Вы также можете пойти другим путем и тайному идентификатор в инфиксного оператора, т.е .:

`foo` 

Вы можете даже сказать:

(`foo`) 

, чтобы превратить его обратно в выражение.

+3

спасибо. Это очищает источник путаницы для меня. Таким образом, разделы представляют собой, по существу, синтаксические конструкции удобства, которые сопоставляют аргументы с правильной стороной оператора инфикса? – Saedeas

+2

@Saedeas: Это точно. –

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