它在庇护所中实际上是什么意思

时间:2018-11-08 19:58:02

标签: functional-programming sanctuary

> 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或将其归约 但是为什么在第一种情况下它的空数组和第二种情况下的相同数组

1 个答案:

答案 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实现赋予权限后,该功能就只能执行一次。