作为双自回归闭范畴的电路
在Haskell中,CCC词汇表是可重载的,因此可以比lambda和application更灵活地解释。 Lambda表达式对人类程序员来说更容易写和读。
2013年9月17日:“为所有类别的产品定义”⇒“为所有产品类别定义”。 感谢汤姆·埃利斯。 2013–09–17:阐明了上面的第一个CCC/lambda对比:“在Haskell中,CCC词汇表是可重载的,因此可以比lambda和应用程序更灵活地解释。”感谢Darryl McAdams。
CCC公司
你可能听说过“笛卡尔封闭范畴”(CCC)。 CCC是一个抽象概念,包含少量词汇和相关法律:
“类别”部分意味着我们有一个“形态”(或“箭头”)的概念,每个都有一个域和余域“对象”。 与结合复合算子存在同一态射。 如果对形态和对象的描述听起来像函数和类型(或集合),那是因为函数和类型是一个示例
身份证件 和
(∘) . “笛卡尔”部分意味着我们有乘积,带有投影函数和一个操作符,可以将两个函数组合成一个对生成函数。 对于Haskell函数,这些操作是
有限状态试验 ,
信噪比 和
(△) .(后者称为“
(&&&) “在中
控制。 箭头 .) “闭合”部分意味着我们有一种方法将形态表示为对象,称为“指数”。 相应的操作是
咖喱 ,
未修剪的 、和
应用 由于Haskell是一种高阶语言,这些指数对象只是(一类)函数。
电路
如何识别预期的输入和输出? 如何确保图形完全连接,而不是预期的外部输入和输出? 如何确保输入引脚最多由一个输出引脚驱动,同时允许输出引脚驱动任意数量的输入引脚? 如何按顺序组合图形,匹配并使用免费的输出和输入?
类型 电路G b条 = 引脚电源 → ( 引脚电源 , [ Comp公司 ],b) --第一次尝试
电路单子
类型 电路M = WriterT(写入器T) ( 顺序 Comp公司 ) ( 州 引脚电源 )
新Pin ∷ 电路M 引脚 新Pin = 做 {(第页 : ps') ← 获取; 放置ps’; 返回 p}
. The
类型 MonadPins品牌 = 莫纳德州 引脚电源
新Pin ∷ MonadPins品牌 米 ⇒ 米 引脚
新类型 引脚 = 引脚 国际 衍生 ( 等式 , 订单 , 显示 , 枚举 ) 类型 引脚电源 = [ 引脚 ]
底层的“原语”,它决定了功能和接口(信息输入和输出的类型), 携带信息到实例中的管脚(来自其他组件的输出),以及 从实例中携带信息的pin。
数据 Comp公司 = ∀ a b类 . 源代码2 a b类 ⇒ Comp公司 ( Prim公司 a b)a b 衍生 实例 显示 Comp公司
新类型 Prim公司 a b类 = Prim公司 字符串
实例 显示 ( Prim公司 a b) 哪里 显示 ( Prim公司 字符串) = 字符串
类型 源代码2 a b类 = ( IsSource(IsSource) a、, IsSource(IsSource) b)
班 显示 一 ⇒ IsSource(IsSource) 一 哪里 至Pins ∷ 一 → 顺序 引脚 genSource(发电机源) ∷ MonadPins品牌 米 ⇒ 百万 numPins数 ∷ 一 → 国际
实例 IsSource(IsSource) () 哪里 至引脚() = ∅ genSource(发电机源) = 返回 () numPins数_ = 0
实例 IsSource(IsSource) 引脚 哪里 至引脚p = 单例p 发电机电源 = 新Pin numPins数_ = 1
实例 源代码2 a b类 ⇒ IsSource(IsSource) (a×b) 哪里 toPins(sa,sb) = toPins sa to Pins某人 genSource(发电机源) = 提升M2(,)genSource genSource numPins数 ~ (a、b) = numPins锁定 + numPins编号b
A电路类别
类型 a⇴b类 = 克莱斯利 电路M --第一次尝试
类型 家庭 引脚 一
类型 实例 引脚 布尔 = 引脚
类型 实例 引脚 () = ()
类型 实例 引脚 (a×b) = 引脚 a× 引脚 b条
新类型 a⇴b类 = C类 ( 克莱斯利 电路M ( 引脚 a)( 引脚 b) )
总和类型
类型 实例 引脚 (a) + b) = 引脚 一 + 引脚 b条 --??
数据 一 :++ b条 = 向上 {sumPin ∷ 顺序 引脚 ,sumFlag(摘要标志) ∷ 引脚 } 类型 实例 引脚 (a) + b) = 引脚 一 :++ 引脚 b条
班 显示 一 ⇒ IsSource(IsSource) 一 哪里 至Pins ∷ 一 → 顺序 引脚 genSource(发电机源) ∷ MonadPins品牌 米 ⇒ 百万 numPins数 ∷ 一 → 国际
实例 源代码2 a b类 ⇒ IsSource公司 (a) :++ b) 哪里 至Pins( 向上 磅/平方英尺) = ps?单粒子f
numPins数_ = (numPins(☑ ∷ a) `最大值` numPins(☑ ∷ b) ) + 1
genSource(发电机源) = 提升M2 向上 (序列复制M ∷ (a) :++ b) ) - 1 )newPin) 新Pin
复制品M ∷ 莫纳德 米 ⇒ 国际 → 百万 → 米( 顺序 a)
分类操作
类别操作
班 类别 k个 哪里
身份证件 ∷ 一 `k个` 一 (∘) ∷ (b) `k个` c) → (a) `k个` b) → (a) `k个` c)
新类型 a⇴b类 = C类 ( 克莱斯利 电路M ( 引脚 a)( 引脚 b) )
实例 类别 (⇴) 哪里
身份证件 = C类 身份证件
C类 g∘ C类 (f) = C类 (g∘f)
身份证件 ∘ C类 f≡ C类 身份证件 ∘ C类 f选 C类 ( 身份证件 ∘f)≡ C类 (f)
实例 类别 (⇴) 哪里
身份证件 = C类 身份证件 (∘) = inC2(∘)
股份有限公司 = C类 ↜ 联合国 英寸C2 = inC↜unC
(h↜f)克 = 小时克小时
产品运营
班 类别 k个 ⇒ 产品类别 k个 哪里 不包括在内 ∷ (a×b) `k个` 一 外汇兑换率 ∷ (a×b) `k个` b条 (△) ∷ (a) `k个` c) → (a) `k个` d) → (a) `k个` (c×d))
(×) ∷ 产品类别 k个 ⇒ (a) `k个` c) → (b) `k个` d) → (a×b `k个` c×d) f×g = f∘exl△gexr 第一 ∷ 产品类别 k个 ⇒ (a) `k个` c) → ((a×b) `k个` (c×b)) 第一个f = f× 身份证件 第二 ∷ 产品类别 k个 ⇒ (b) `k个` d) → ((a×b) `k个` (a×d)) 第二克 = 身份证件 ×克
实例 产品类别 (⇴) 哪里 不包括在内 = C类 不包括在内 外汇兑换率 = C类 外汇兑换率 (△) = 英寸C2(△)
克莱斯利 电路M ( 引脚 a× 引脚 b)( 引脚 b)
克莱斯利 电路M ( 引脚 (a×b))( 引脚 b)
类型 实例 引脚 (a×b) = 引脚 a× 引脚 b条
exl∘(u△v)≡u
exl∘( C类 f△ C类 g) ≡ C类 exl∘ C类 (f△g) ≡ C类 (不包括(f△g)) ≡ C类 (f)
副产品操作
班 类别 k个 ⇒ 副产品Cat k个 哪里 英制 ∷ 一 `k个` (a) + b) 内部 ∷ b条 `k个` (a) + b) (▽) ∷ (a) `k个` c) → (b) `k` c) → ((a) + b) `k个` c)
exl∘(u△v)≡u
(u▽v)∘inl≡u
英制 = C类 ∘ 克莱斯利 $ λa →
做 x个 ← 常量M False(错误) 一 让 纳 = numPins(☑ ∷ 引脚 a) 编号 = numPins(☑ ∷ 引脚 b) 衬垫 = 顺序复制( 最大值 钠铌 - 纳)x 返回 ( 向上 (固定一个垫子)x)
英寸C ∷ 源代码P2 a b类 ⇒ a⇴a + b条
类型 IsSourceP公司 一 = IsSource(IsSource) ( 引脚 a) 类型 源代码P2 a b类 = ( IsSourceP公司 a、, IsSourceP公司 b)
第二个C ∷ IsSource(IsSource) ( 引脚 c) ⇒ (c×c)× 布尔 )⇴c
提取 sumFlag(汇总标志) 对于 布尔 , 拔出销 一 把它们喂给 (f) , 拔出销 b条 把它们喂给 克 、和 将这三个结果输入 秒C :
f▽g = 第二C((f×g)提取△pureC和标志)
(×) ∷ 产品类别 k个 ⇒ (a) `k个` c) → (b) `k个` d) → ((a×b) `k个` (c) * d) ) f×g = f∘exl△gexr
纯C ∷ ( 引脚 一 → 引脚 b) → (a⇴b) 纯C = C类 ∘arr
提取两者 ∷ 信息源P2 a b类 ⇒ 一 + b⇴a×b 提取两者 = pureC((引脚源△引脚源)∘sumPins)
引脚源 ∷ IsSource(IsSource) 一 ⇒ 顺序 引脚 → 一 端号源端号 = Mtl.evalState genSource(列出管脚)
我们不太明白 副产品Cat 实例,因为 IsSource(IsSource) 所有三个潜在方法定义施加的约束。 定义比 产品类别 实例,并且不会对这些定义表现出明显的二重性。 使用 提取两者 我很害怕,因为它意味着任何两种类型之间都存在某种动态转换。 (考虑 exr∘extract两者都是inl .)
关闭
应用 ∷ (a⇨b)×a↝b 咖喱 ∷ (a×b↝c) → (a↝(b⇨c)) 未修剪 ∷ (a↝(b⇨c)) → (a×b↝c)
数据 b⇨c公司 哪里 ⋯
克隆(_yz) ∷ A类 → ( B类 ⇨ C类 )
未修剪的 ∷ (a↝(b⇨c)) → (a×b↝c)