Подтвердить что ты не робот

Что делает оператор infix в Haskell?

Я читаю Нежное введение в Haskell (это не так уж и ласково), и он неоднократно использует оператор : без прямого объяснения что он делает.

Итак, что именно он делает?

4b9b3361

Ответ 1

: - это оператор "preend":

x : xs

Возвращает список, который имеет x как первый элемент, за которым следуют все элементы в xs. В других функциональных языках это обычно называется cons, потому что "cons" рекурсивно редуцирует список повторным приложением из пустого списка:

1 : 2 : 3 : 4 : []

- это список [1, 2, 3, 4].

Ответ 2

Всегда можно проверить типы в GHCi/HUGS, так как первые шаги в руководстве помогут вам загрузить GHC/HUGS.

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]

Из их соответствующих типов довольно легко вывести их использование.

PS: http://haskell.org/hoogle/ является удивительным.

Ответ 3

Оператор: в Haskell является конструктором списков. Это означает, что все, что находится перед двоеточием, указано в списке, указанном после него.

Например, список целых чисел производится путем "consing" каждого номера в пустой список, например:

Список [1,2,3,4] может быть построено следующим образом:

  • 4 : [] (соответствует 4 пустым спискам)
  • 3 : [4] (включение 3 в список, содержащий 4)
  • 2 : [3,4] (включение 2 в список, содержащий 3, 4)
  • 1 : [2,3,4] (включение 1 в список, содержащий 2,3,4)

дает вам;

[1,2,3,4]

Написано полностью:

1 : 2 : 3 : 4 : []

Ответ 4

Это тип конструктора для списков. Он ничем не отличается от любого другого конструктора типа Just или Left, за исключением того, что он является infix. Допустимые конструкторы типов могут быть словами, начинающимися с прописной буквы, или символами, начинающимися с двоеточия.

Таким образом, вы можете определить конструкторы infix для ваших собственных типов данных. Например:

data MyList a = a :> MyList a
              | Empty

в приведенном выше коде мы определяем тип с именем MyList с двумя конструкторами: первый - это странный конструктор :>, который принимает элемент и другой MyList a; второй - пустой конструктор Empty, который эквивалентен [] в собственных списках Haskell.

Вышеупомянутое эквивалентно:

data MyList a = Cons a  (MyList a)
              | Empty