> S.reduce(S.flip(S.K),[],S.Left([1,2]))
[]
> S.reduce(S.flip(S.K),[],S.Right([1,2]))
[ 1, 2 ]
我试图了解 sanctuary 及其工作,任何人都可以详细解释上述结果在我的理解中,S.reduce 采用映射函数并使用应该是类型的输入数组并减少它但是为什么它在第一种情况下是空数组和第二种情况下的相同数组
> S.reduce(S.flip(S.K),[],S.Left([1,2]))
[]
> S.reduce(S.flip(S.K),[],S.Right([1,2]))
[ 1, 2 ]
我试图了解 sanctuary 及其工作,任何人都可以详细解释上述结果在我的理解中,S.reduce 采用映射函数并使用应该是类型的输入数组并减少它但是为什么它在第一种情况下是空数组和第二种情况下的相同数组
让我们从一个更熟悉的例子开始: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
,看看它将如何对 Either 值进行操作。
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 的 Either 类型的实现在给定 Right 时仅应用该函数一次。