перенаправление haskell - PullRequest
       6

перенаправление haskell

2 голосов
/ 02 февраля 2011

Работа в F # привела меня к изучению Haskell. Я в настоящее время на седьмой главе этого учебника, который я НАСТОЯТЕЛЬНО рекомендую. Быстрый вопрос, хотя. Возможно, я забегаю вперед и найду ответ в следующих главах, но есть ли способ изменить положение функции и ее аргументов, если функция принимает только один аргумент, как в F #. Так, например, в F #, если у вас есть функция digitToInt (как в Haskell), вы можете сделать следующее:

3 |> digitToInt

Я знаю об использовании обратных тиков, но это специально для бинарных функций. Есть ли что-нибудь похожее для унарных функций?

Ответы [ 3 ]

8 голосов
/ 02 февраля 2011

Один из способов сделать это может быть определение инфиксной функции (|>), которая принимает значение и функцию и вызывает функцию, передавая ей значение следующим образом:

(|>) :: a -> (a -> b) -> b
(|>) x f = f x

Тогда вы можете использовать его так же, как в вашем примере:

3 |> digitToInt
5 голосов
/ 02 февраля 2011

Вы можете сделать то, что предлагает peoro, и он отлично работает.Однако я бы посоветовал против этого.Обычный способ «прочесть» Haskell подобен предложению - слева направо, с глаголами в начале и темой в конце.Обычно вы получаете цепочечную композицию типа f . g. q . r $ x.С монадическими операторами вы получаете f =<< g =<< x (или (f <=< g) =<< x), а с аппликативными - f <$> x <*> y <*> z.Так что изменение нормального порядка вещей не обязательно идиоматично.

Кстати, причина того, как я слышал, что F # выбрал противоположный оператор, заключается в том, что он очень хорошо работает с автозаполнением visualstudio - есливы ввели значение, с которым работаете, и его тип может определять варианты действий с ним.Такая поддержка инструментов является великолепной, и это было бы хорошим аргументом для принятия альтернативного стиля.

1 голос
/ 02 февраля 2011

Я не думаю, что в Haskell есть стандартный оператор для этого (я могу ошибаться), но вы, безусловно, можете определить его. Несколько связанной концепцией является оператор $, который позволяет избавиться от скобок при написании ряда приложений (что является одной из причин использования |> в F #). Разница в том, что $ не меняет порядок:

f $ g $ h x  =  f (g (h x))

Кстати: фантастический способ узнать подобные вещи в Haskell - это использовать Hoogle. Например:

...