在Haskell中,我如何派生:实例类别(摩尔a b - >摩尔b c)

时间:2016-09-22 07:27:01

标签: haskell instance category-theory

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

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),但我没有工作。

问题是,参数aid(.)的定义并不重要。 E.g:

id :: MooreT a b b
id x = x

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

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

1 个答案:

答案 0 :(得分:2)

MooreT atype子类型的(->)同义词。 (->)已有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