Я пытался понять аппликатив и то, как я могу использовать его как декартово произведение между K
функциями и N
параметрами, и я не могу понять, почему я не могу сделать следующее:
[Just (+1),Just (+2)] <*> [Just 1 ,Just 2]
визуализирует
Ошибка
* Couldn't match expected type `Maybe Integer -> b'
with actual type `Maybe (Integer -> Integer)'
* Possible cause: `Just' is applied to too many arguments In the expression: Just (+ 1) In the first argument of `(<*>)', namely `[Just (+ 1), Just (+ 2)]'
In the expression: [Just (+ 1), Just (+ 2)] <*> [Just 1, Just 2]
Я не понимаю, так как из определения предполагается вырывать функции из контекста, брать значения и применять все комбинации.
Я также пробовал:
:t [pure (+1),pure (+2)] <*> [Just 1 ,Just 2] :: Num a => [a -> a]
и я не могу понять, почему результирующий тип не является списком значений (и не a->a
), так как все операторы ожидают только один аргумент, а я его уже предоставляю.
Может кто-нибудь пролить свет?
[]
) не содержит функций. Он содержитMaybe
s. Таким образом, попытка применить функции в контексте является ошибкой типа. Вот почему ошибка говорит, что она ожидала функцию, но вместо этого получилаMaybe
. Вместо этого попробуйте[(+1), (+2)] <*> [1,2]
. - person Rein Henrichs   schedule 21.04.2019Maybe
. - person Willem Van Onsem   schedule 21.04.2019[]
иMaybe
? Если это так, то это не будет работать по умолчанию, потому что GHC не понимает, что вы работаете с композицией. Вам нужно сделать новый тип для композиции, либо с помощью Составить или вручную с помощью чего-то вродеnewtype MaybeList a = [Maybe a]
(а затем указать свой собственный экземплярApplicative
дляMaybeList
). - person Robin Zigmond   schedule 21.04.2019