functional-programming - 圣域里的左右到底是什么意思
问题描述
> 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 时仅应用该函数一次。
推荐阅读
- ios - 如何在 iOS 上安装和首次运行期间跟踪是否更新文件
- node.js - 如何在 NodeJS 中超时并取消 fs.rm() 操作?
- r - 使用混合变量和表达式标记 ggplot
- python - python会抛出“堆栈溢出”错误吗?
- visual-studio-code - 如何在 Visual Studio 代码中显示“打开更改”图标
- javascript - 算法:包含至少 k 个数字的连续子数组的计数,这些数字在子数组中恰好出现一次
- javascript - 在官方 API 文档中哪里可以找到 Model.deleteOne 的使用?
- python - 如何将 AsyncIterator 转换为 Iterator?
- firebase - 需要知道 Google 存储 Cloud Storage 内容的确切地理位置
- python - 将字符串输出写入 csv 文件。使用临时文件时出错