Что это на самом деле означает левый и правый в святилище
> S.reduce(S.flip(S.K),[],S.Left([1,2]))
[]
> S.reduce(S.flip(S.K),[],S.Right([1,2]))
[ 1, 2 ]
Я пытался понять святилище, и его работа может кто-нибудь подробно объяснить вышеупомянутые результаты. В моем понимании S.reduce берет функцию отображения и использует входной массив, который также должен иметь тип, и уменьшает его. Но почему его пустой массив в первом случае и тот же массив во втором случае
1 ответ
Давайте начнем с более знакомого примера: использование S.reduce
на массиве.
> S.reduce (acc => s => acc + s) ('initial:') (['foo', 'bar', 'baz'])
'initial:foobarbaz'
Теперь давайте определимся с типом S.reduce
объяснить поведение выше.
S.reduce :: Foldable f => (b -> a -> b) -> b -> f a -> b
-- replace ‘Foldable f => f’ with ‘Array’ --
S.reduce :: (b -> a -> b) -> b -> Array a -> b
Далее давайте уточним тип S.reduce
чтобы увидеть, как он будет работать с любыми значениями.
S.reduce :: Foldable f => (b -> a -> b) -> b -> f a -> b
-- replace ‘Foldable f => f’ with ‘Either x’ --
S.reduce :: (b -> a -> b) -> b -> Either x a -> b
Что мы можем сделать, когда дано S.Left ('foo')
как Either x a
? У нас есть x
('foo'
) но нет a
, Потому что у нас нет a
мы не можем использовать b -> a -> b
функция. Таким образом, единственный b
мы можем возможно вернуть это начальное значение.
> S.reduce (acc => s => acc + s) ('initial:') (S.Left ('foo'))
'initial:'
Что мы можем сделать, когда дано S.Right ('bar')
как Either x a
? У нас есть a
, который мы могли бы скормить b -> a -> b
функция вместе с начальным значением для получения другого значения типа b
,
> S.reduce (acc => s => acc + s) ('initial:') (S.Right ('bar'))
'initial:bar'
Если S.reduce
должны были вернуться 'initial:'
или же 'initial:bar:bar:bar'
в случае выше это все еще будет соответствовать сигнатуре типа, но fantasy-land/reduce
Реализация для любого типа в Sanctuary применяет функцию ровно один раз, когда ей дают право.