首页 > 解决方案 > 圣域里的左右到底是什么意思

问题描述

> 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 采用映射函数并使用应该是类型的输入数组并减少它但是为什么它在第一种情况下是空数组和第二种情况下的相同数组

标签: functional-programmingsanctuary

解决方案


让我们从一个更熟悉的例子开始: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/reduceSanctuary 的 Either 类型的实现在给定 Right 时仅应用该函数一次。


推荐阅读