在 Haskell 中,如何导出:实例类别 (Moore a b -> Moore b c)

in Haskell, how do I derive: instance Category (Moore a b -> Moore b c)

我正在尝试为 Moore 自动机转换器派生一个类别实例,其中:

data Moore a b = Moore b (a -> Moore a b)
type MooreT a b c = (Moore a b -> Moore a c)

问题是,MooreT有3个参数,而Category只有2个。我试过写:instance Category (MooreT a),但没有成功。

事实是,参数 a 对于 id(.) 的定义真的无关紧要。例如:

id :: MooreT a b b
id x = x

有没有办法定义这样的实例?或者我是否必须为特定类型 a 定义 MooreT,例如 type IntMooreT a b = MooreT Int a b?

我对 Haskell 还是个新手,所以很抱歉,如果这是一个愚蠢的问题。

MooreT a(->) 子类型的 type 同义词。 (->) 已经有一个 Category 实例,所以 MooreT a 也有。

ghci 可以检查 MooreT 是否已经与 . 组合。从您的定义和 Category 的导入开始,检查我们是否正确导入 .

Prelude> data Moore a b = Moore b (a -> Moore a b)
Prelude> type MooreT a b c = (Moore a b -> Moore a c)
Prelude> :t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
Prelude> import Control.Category
Prelude Control.Category> import Prelude hiding ((.), id)
Control.Category Prelude> :t (.)
(.) :: Category cat => cat b c -> cat a b -> cat a c

制作几个虚拟 MooreT 值,fg

Control.Category Prelude> data A = A
Control.Category Prelude> data B = B
Control.Category Prelude> data C = C
Control.Category Prelude> data D = D
Control.Category Prelude> f = undefined :: MooreT A B C
Control.Category Prelude> :t f
f :: MooreT A B C
Control.Category Prelude> g = undefined :: MooreT A C D

检查组合是否有效

Control.Category Prelude> :t g . f
g . f :: Moore A B -> Moore A D