> S.reduce(S.flip(S.K),[],S.Left([1,2]))
[]
> S.reduce(S.flip(S.K),[],S.Right([1,2]))
[ 1, 2 ]
我试图了解避难所及其工作,任何人都可以详细解释上述结果 以我的理解,S.reduce具有映射功能并使用输入数组,该输入数组应为type或将其归约 但是为什么在第一种情况下它的空数组和第二种情况下的相同数组
答案 0 :(得分: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'
仍符合类型签名,但是适用于Sanctuary的Either类型的fantasy-land/reduce
实现赋予权限后,该功能就只能执行一次。