Все предложения до сих пор хороши. Вот еще один, который может показаться немного странным вначале, но оказывается весьма удобным во многих других ситуациях.
Некоторые операторы формирования типа, такие как []
, который является оператором, который отображает тип элементов, например. Int
к типу списков этих элементов, [Int]
, Иметь собственность быть Applicative
. Для списков это означает, что есть какой-то способ, обозначенный оператором, <*>
, произнесенный «применить», чтобы включить списки функций и содержит аргументов в результатов.
(<*>) :: [s -> t] -> [s] -> [t] -- one instance of the general type of <*>
вместо вашего обычного приложения, учитывая пробел или $
($) :: (s -> t) -> s -> t
Получается, что мы можем сделать обычное функциональное программирование со списками вещей вместо вещей: мы иногда называем это "программирование в списке idiom". Единственный другой ингредиент состоит в том, чтобы справиться с ситуацией, когда некоторые из наших компонентов индивидуальных вещей, нам нужен дополнительный гаджет
pure :: x -> [x] -- again, one instance of the general scheme
который оборачивает вещь в качестве списка, чтобы быть совместимыми с <*>
. То есть pure
перемещает обычное значение в аппликативную идиому.
Для списков pure
просто делает одиночный список, а <*>
производит результат каждого попарного применения одной из функций к одному из аргументов. В частности
pure f <*> [1..10] :: [Int -> Int -> Int -> Int -> Int]
список функций (так же, как map f [1..10]
), которые могут быть использованы с <*>
снова. Остальные аргументы за f
не перечислены, поэтому вам нужно указать pure
.
pure f <*> [1..10] <*> pure 1 <*> pure 2 <*> pure 3 <*> pure 4
Для списков, это дает
[f] <*> [1..10] <*> [1] <*> [2] <*> [3] <*> [4]
т.е. список способов, чтобы сделать приложение из F, один из [1..10], то 1, 2, 3 и 4.
Открытие pure f <*> s
настолько распространена, что это аббревиатура f <$> s
, так
f <$> [1..10] <*> [1] <*> [2] <*> [3] <*> [4]
является то, что, как правило, записывается. Если вы можете отфильтровать шумы <$>
, pure
и <*>
, это похоже на приложение, которое вы имели в виду. Дополнительная пунктуация необходима только потому, что Haskell не может определить разницу между вычислением списка кучи функций или аргументов и неличным вычислением того, что предназначено как одно значение, но, как оказалось, является списком. Однако, по крайней мере, компоненты находятся в том порядке, в котором вы начали, поэтому вы более легко видите, что происходит.
Esoterica. (1) в моей (не очень) private dialect из Haskell, выше будет
(|f [1..10] (|1|) (|2|) (|3|) (|4|)|)
где каждый идиома кронштейн, (|f a1 a2 ... an|)
представляет собой применение чистой функции к нулю или более аргументов, которые живут в идиомы , Это просто способ, чтобы написать
pure f <*> a1 <*> a2 ... <*> an
Идрис идиома скобки, но Haskell не добавил их. Все же.
(2) В языках с алгебраическими эффектами идиома недетерминированных вычислений - это не одно и то же (тип typechecker) как тип данных списков, хотя вы можете легко преобразовать между ними. Программа превращается в
f (range 1 10) 2 3 4
где диапазон недетерминированно выбирает значение между данными нижними и верхними границами. Таким образом, неопределенность рассматривается как побочный эффект , а не структура данных, позволяющая выполнять операции для отказа и выбора. Вы можете обернуть недетерминированные вычисления в обработчике , который дает значения этим операциям, и один из таких обработчиков может генерировать список всех решений. То есть, дополнительные обозначения, объясняющие, что происходит, выталкиваются на границу, а не проникают через весь интерьер, например, те <*>
и pure
.
Управление границами вещей, а не их интерьерами является одной из немногих хороших идей, которые наш вид сумел иметь. Но, по крайней мере, мы можем повторять это снова и снова. Поэтому мы вместо фермы вместо охоты. Именно поэтому мы предпочитаем проверку статического типа на динамическую проверку тегов. И так далее...
один из лучших аппликативных учебники я видел! –
На самом деле не получается, как недетерминизм подходит в аппликациях – pedrofurla
Я еще не понимаю, какие скобки идиомы добавляют в сторону больше синтаксиса для изучения. Вы, кажется, по-разному относитесь к ним. Могли бы вы объяснить? – dfeuer