haskell - 寻找类别对象可部分消耗的类型类(化学工程)

标签 haskell logic typeclass category-theory

问题

我想描述化学工程中将某些物质转化为其他物质的过程。是否存在描述消耗“物质”的态射的类别?

我想要建模的例子

举几个例子:

将两种物质结合成混合物的转化混合物。

将物质煮沸成一些副产品的转化煮沸。

根据预定义的比例将一种物质分离用于 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,或许先找到一个等价的逻辑再映射到类别上会更容易一些。我偶然发现了似乎有帮助的线性逻辑:

more about linear logic

最佳答案

这可能是 Linear Haskell 的一个很好的应用! GHC 9.0 及更新版本支持启用线性函数的 LinearHaskell

关于haskell - 寻找类别对象可部分消耗的类型类(化学工程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71211918/

相关文章:

haskell - 如果某个函数为真,则追加到字符串

javascript - 每个星期五直到某个日期,但以实用的方式?

haskell - 使用 Aeson 解析嵌套 JSON 中的数组

haskell - 修复箭头轴(图表库)

java - 循环并比较变量值

algorithm - 解决这种逻辑问题的方法是什么?

haskell - 带 kind * -> * 的类型类实例的类型参数约束

mysql - 搜索查询以返回每个结果中的所有项目都包含在查询中的结果

haskell - 泛化类参数

haskell - 如何在这里避免显式类型签名?