Что это на самом деле означает левый и правый в святилище

> 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 применяет функцию ровно один раз, когда ей дают право.

Другие вопросы по тегам