范畴理论和抽象代数处理函数可以与其他函数结合的方式。复杂性理论研究一个函数的计算难度。对我来说很奇怪,我没有看到任何人把这些研究领域结合起来,因为它们看起来像是如此自然的组合。以前有人这么做过吗?
作为一个激励的例子,让我们来看看MonoIds。众所周知,如果一个运算是一个半群,那么我们可以并行化这个运算。
instance Monoid Int where
mempty = 0
mappend = (+)
foldl1' (+) [0..999]
mconcat [0..999] -- for simplicity of the code, I'm ignoring that this doesn't *actually* run in parallel
似乎应该有一个方便的方法来描述这两个单元体之间的区别。然后,我们应该能够用这些差异来注释我们的代码,并让程序自动选择最佳算法来使用取决于一个半群的复杂度。
我并不声称自己是这些问题的专家,但我可能会对这个想法有所启发。
让我们首先考虑范畴理论。范畴理论是一种在很高水平上对数学结构的研究。范畴的概念是非常普遍的,许多数学对象构成范畴。范畴理论最初被认为是极其纯粹和抽象的,但由于这些东西经常出现在数学中,它在应用学科中有许多用途,如计算机科学,甚至量子力学。单子被证明在推理函数程序的语义方面有很大的用处,函数程序通常是用指称的方式表示的(因此不强迫计算任何顺序,只强迫计算结果)。由此也认识到单子也是编写函数程序的一个非常好的设计模式,它的有用性导致它在Haskell的设计中非常突出(即do符号等)。函子、应用子、单子都是后来出现的对象,功能不如单子强大,但因此也更适用(没有双关语!)。
然而,范畴理论以一种更普遍的方式研究这些结构,它已经被证明与数学(和物理等)的许多领域有关。作为一个非专家,目前还不清楚这其中有多少可能与复杂性理论有关,但让我们试试看。
如果我们知道某一类型是一个半群,那么我们对处理它的复杂性有什么理由呢?这是data.monoid
中的类定义
class Monoid a where
mempty :: a
mappend :: a -> a -> a
mconcat :: [a] -> a
mconcat = foldr mappend mempty
当然,我们不能说任何复杂性,因为我们所知道的只是类型,正如你猜测的那样。关于data.monoid中mconcat
的默认实现,文档中有以下内容:
-- ^ Fold a list using the monoid.
-- For most types, the default definition for 'mconcat' will be
-- used, but the function is included in the class definition so
-- that an optimized version can be provided for specific types.
我想指出的一点是,Mconcat
不能从其他操作的复杂性中得到推广。在许多情况下,很难证明一些更快的算法不存在。在这种情况下,Mconcat
可以手动实现。
parList :: Strategy a -> Strategy [a]
parList strat [] = ()
parList strat (x:xs) = strat x `par` (parList strat xs)
parMap :: Strategy b -> (a -> b) -> [a] -> [b]
parMap strat f xs = map f xs `using` parList strat
using :: a -> Strategy a -> a
using x s = s x `seq` x
总之,范畴理论有可能成为未来复杂性研究的有用工具。然而,我不认为这可能导致自动生成并行策略。
从范畴理论的角度来看,这个答案包括以下陈述: ...事实是co和逆变函子之间没有真正的区别,因为每个函子都是协变函子。 更详细地说,从C类到D类的逆变函子F无非是F型的(协变)函子:COP→D,从C的相反类到D类。 另一方面,Haskell的和仅要求分别为实例定义和。这表明,从Haskell的角度来看,存在但不是的对象(反之亦然)。 因此,在范畴理论中,似乎“co和逆变函子之间没有真正的区别”,而
现在考虑一个成员类型为的typeclass。例如,可以想象一个类型类,它对应于组的类别(从技术上讲,是的子类别,其对象包含Haskell的所有类型)。概括: 问题2:Haskell中每个成员类型为的typeclass是否都对应于某个类别(从技术上讲:的某个子类别)? 由此可以提出下一个一般性问题: 一般问题:每一个Haskell类型类是否都对应于某种范畴理论的概念? Edit:至少,您可以说,由于
在Haskell中有Hask,其中的对象是Haskell类型,而态性是Haskell函数。但是,type类有一个函数,它在这些类型(因此是对象而不是类别本身)之间进行映射: 和都是HASK中的对象。这是否意味着Haskell中的每个实例都是一个内函数,如果不是,真的表示一个函数吗?
本章讨论的几个关键点: 学习函数式反应型编程,我们将会更加高效。 声明式编程把我们从关注业务的实现细节中解脱出来,用更多的时间关注业务本身。 函数式反应型编程是函数式与反应式编程的结晶。 我是一个实用主义者。我们所有的开发者们都是在实践中完成自己的作品的。因此我想尽可能少的占用你的时间来讲述理念的东西,在下一章节,我们将深入探讨代码实现。
这一章描述各种理论性概念和那些不直接涉及实践,但是知道了会很有用的概念。 分页 Elf64 格式 內联汇编
Note 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 PBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。正因为基于物理的渲染目的便是为了使用一种更符合物理学规律的方式来模拟