Я читаю Нежное введение в Haskell (это не так уж и ласково), и он неоднократно использует оператор :
без прямого объяснения что он делает.
Итак, что именно он делает?
Я читаю Нежное введение в Haskell (это не так уж и ласково), и он неоднократно использует оператор :
без прямого объяснения что он делает.
Итак, что именно он делает?
:
- это оператор "preend":
x : xs
Возвращает список, который имеет x
как первый элемент, за которым следуют все элементы в xs
. В других функциональных языках это обычно называется cons
, потому что "cons" рекурсивно редуцирует список повторным приложением из пустого списка:
1 : 2 : 3 : 4 : []
- это список [1, 2, 3, 4]
.
Всегда можно проверить типы в GHCi/HUGS, так как первые шаги в руководстве помогут вам загрузить GHC/HUGS.
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Из их соответствующих типов довольно легко вывести их использование.
PS: http://haskell.org/hoogle/ является удивительным.
Оператор: в 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 : []
Это тип конструктора для списков. Он ничем не отличается от любого другого конструктора типа Just
или Left
, за исключением того, что он является infix. Допустимые конструкторы типов могут быть словами, начинающимися с прописной буквы, или символами, начинающимися с двоеточия.
Таким образом, вы можете определить конструкторы infix для ваших собственных типов данных. Например:
data MyList a = a :> MyList a
| Empty
в приведенном выше коде мы определяем тип с именем MyList
с двумя конструкторами: первый - это странный конструктор :>
, который принимает элемент и другой MyList a
; второй - пустой конструктор Empty
, который эквивалентен []
в собственных списках Haskell.
Вышеупомянутое эквивалентно:
data MyList a = Cons a (MyList a)
| Empty