Что означает оператор (:>) в конструкторе данных?

Кто-нибудь знает, что означает конструктор ': > ' в следующем коде:

data Rose a = a :> [Rose a]
    deriving (Eq, Show)

Ответы

Ответ 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]

который будет иметь тот же тип. В некоторых случаях инфиксные функции/конструкторы более интуитивно понятны и делают код более понятным.