Ответ 1
В Haskell функции, имя которых состоит из буквенно-цифровых символов, по умолчанию префикс, а функции, составленные из таких символов, как +
, >
, $
и т.д., по умолчанию являются инфиксами. Например, вы можете определить функцию infix, например
Prelude> let a $%^ b = a + b
Prelude> :t ($%^)
($%^) :: Num a => a -> a -> a
То же самое относится к конструкторам ( Редактировать: как правильно заметил @ChrisTaylor, с ограничением на то, что имя конструктора инфикса должно начинаться с :
). Строка
Prelude> data Rose a = a :> [Rose a]
означает, что :>
является конструктором, который принимает два аргумента:
Prelude> :t (:>)
(:>) :: a -> [Rose a] -> Rose a
Вы также можете создать конструктор нормального вида, как
data Rose a = RoseCtr a [Rose a]
который будет иметь тот же тип. В некоторых случаях инфиксные функции/конструкторы более интуитивно понятны и делают код более понятным.