Использование функции наподобие метода ООП в Haskell - PullRequest
1 голос
/ 15 января 2012

В эти дни я изучаю Haskell, и у меня появилась идея использовать функцию, такую ​​как метод ООП.

Сначала определите оператор, как показано ниже:

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

Как видите, этот оператор меняет порядок функции f, а аргумент x затем применяет его. Например, equals может быть определено как:

equals :: Eq a => a -> a -> Bool
equals = \x -> \y -> x == y

comparison = (1 + 2) // equals 3 -- True

Теперь вот мой вопрос. Это хороший подход с использованием функции Haskell, такой как метод ООП? Это означает, что инверсия функции и (первый) аргумент хороши или нет.

UPDATE

Здесь регистр обратного удара (`) недоступен.

data Person = Person { name :: String }
myself = Person "leafriend"

тогда

> name myself
"leafriend"
> myself // name
"lefirend"
> myself `name`
ERROR - Syntax error in expression (unexpected end of input)

1 Ответ

2 голосов
/ 15 января 2012

То, что вы написали, это просто вопрос стиля.(Хотя программистам на C / Java кажется довольно жестоким использовать // в качестве оператора.) Я бы не рекомендовал использовать это по нескольким причинам, главным образом потому, что:

  • Это не идиоматичный Haskellсбивает с толку любого Хаскеллера, пытающегося прочитать ваш код
  • Вам не следует думать о Хаскеле, как о языке ООП

Если вы пытаетесь заставить Хаскелл выглядеть болееваш любимый язык ООП, вы делаете это неправильно.Haskell должен выглядеть как математика: вид lisp-y, с приложением префиксной функции, но также с доступными инфиксными функциями и операторами.

...