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

在Haskell中,如何派生:实例类别(Moore a b->;Moore b c),haskell,instance,category-theory,Haskell,Instance,Category Theory,我试图为Moore automaton transformers导出一个类别实例,其中: 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个参数。我试着写:实例类别(MooreT a),但没有成功 问题是,参数a对于id和(.)的定义实际上并不重要。例如: id :: MooreT a b b id x

我试图为Moore automaton transformers导出一个类别实例,其中:

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个参数。我试着写:
实例类别(MooreT a)
,但没有成功

问题是,参数
a
对于
id
(.)
的定义实际上并不重要。例如:

id :: MooreT a b b
id x = x
有没有办法定义这样一个实例?或者我必须为特定类型的
a
定义
MooreT
,比如
type IntMooreT a b=MooreT inta b


我还是哈斯克尔的新手,如果这是一个愚蠢的问题,我很抱歉。

MooreT a
类型的同义词
(>)
(>)
已经有了一个
类别
实例,所以
MooreT a也有

ghci
可以检查
MooreT
s是否已与
组合。从您对
类别的定义和导入开始,检查是否导入了正确的

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
值、
f
g

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

“我试着写:
实例类别(MooreT a)
,但没有成功。”。这是正确的方法。请给出您尝试的实际代码和遇到的错误消息,我们可以帮助您修复错误:*类型同义词
MooreT'应该有3个参数,但在
Category(MooreT a)'@redlog的实例声明中给出了1*。编译器准确地告诉了您问题所在(您应该阅读它给您的错误)
MooreT
是一个类型同义词,这意味着在使用时必须完全应用它(即,它必须应用于3个参数)和
实例类别(MooreT a)
它显然只适用于一个。@user2407038好吧,如果它被完全应用,它将丢失作为
类别的实例所需的两个自由参数。我回答Benjamin Hodgson,因为他说:“这是正确的方法”。我确实读过GHCI错误。@Reddog非常准确,这就是为什么您通常不能将类型同义词放入类型类的实例中-您必须将类型包装在
newtype
data
中。当然,您是对的!无法看到树的森林:)仍然想知道为什么
实例类别(MooreT a)其中…
产生错误。