问题
我想描述化学工程中将某些物质转化为其他物质的过程。是否存在描述消耗“物质”的态射的类别?
我想要建模的例子
举几个例子:
将两种物质结合成混合物的转化混合物。
将物质煮沸成一些副产品的转化煮沸。
根据预定义的比例将一种物质分离用于 2 个不同过程的转化拆分。
等等……
不是函数
如您所见,每个化学过程不仅仅是一个函数,因为它的目标不是“计算”一个值,而是将一定数量的某些物质转化为其他物质。
也许是一个类别?
这让我想到了概括函数概念的类别。
类类别猫在哪里 -- |恒等态射 id::猫 a a
-- | morphism composition
(.) :: cat b c -> cat a b -> cat a c
从概念上讲,这是可行的,因为化学过程正是以这种方式可组合的。
更具体的类别
我知道有更具体的类别实例可以编码更多抽象(例如,笛卡尔类别)。笛卡尔类别介绍产品:
instance PreCartesian Hask (,) where
fst = Prelude.fst
snd = Prelude.snd
diag a = (a,a)
(f &&& g) a = (f a, g a)
-- alias
class (Monoidal k p i, PreCartesian k p) => Cartesian k p i | k -> p i
instance (Monoidal k p i, PreCartesian k p) => Cartesian k p i
但是,有一个问题。从概念上讲,笛卡尔范畴中的态射“计算”而不是“消费”它们的对象。从函数 diag a = (a, a) 可以看出它可以复制对象(这在化学工程中是不可能的)。
似乎大多数类别类型类都处理“计算”而不是“消费”。
消耗品类别?
是否有任何类别描述使用其对象的态射?我可以在 Haskell 或研究论文中寻找任何有用的实现吗?
线性逻辑
使用Curry-Howard,或许先找到一个等价的逻辑再映射到类别上会更容易一些。我偶然发现了似乎有帮助的线性逻辑:
最佳答案
这可能是 Linear Haskell 的一个很好的应用! GHC 9.0 及更新版本支持启用线性函数的 LinearHaskell
。
关于haskell - 寻找类别对象可部分消耗的类型类(化学工程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71211918/