Знак доллара внутри закрытых паренов
У фрагмента Websocket есть утверждение, у которого есть знак доллара внутри закрытых паренов, как это,
any ($ fst client)
Так как Haskellers используют $
знак вместо парней, зачем нам здесь парены?
Почему есть $
символ между паранами?
Я пытался увидеть, если $
это функция, делая
Prelude>:t $
Но это бросило ошибку, parse error on input $
2 ответа
В Haskell операторы - это просто обычные функции, имена которых состоят из символов и по умолчанию используют инфикс. Вы можете использовать их как обычный идентификатор, заключив их в скобки:
λ> :t (+)
(+) :: Num a => a -> a -> a
$
это просто оператор, как это само по себе. Он представляет собой приложение функции и определяется следующим образом:
f $ x = f x
Вы можете получить его тип так же, как (+)
:
λ> :t ($)
($) :: (a -> b) -> a -> b
Операторы Haskell также могут быть частично применены как обычные функции, заключая их в скобки с аргументами в одну сторону. Например, (+ 1)
такой же как \ x -> x + 1
а также (1 +)
такой же как \x -> 1 + x
,
Это относится к $
тоже так ($ fst client)
такой же как \ f -> f $ fst client
или просто \ f -> f (fst client)
, Фрагмент кода, который у вас есть, проверяет, возвращает ли какая-либо из списка функций значение true fst client
,
($ fst client)
это раздел оператора (так же, как (+ 1)
или же (* 2)
) - он частично применяет оператор к своему правому операнду. Более подробный способ написать это будет (\f -> f $ fst client)
,
Итак, вы подаете заявку any
к функции, которая принимает другую функцию и применяет эту функцию к аргументу fst client
,