在 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
值,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
我正在尝试为 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
值,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