我正在尝试为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)
,但我没有工作。
问题是,参数a
对id
和(.)
的定义并不重要。 E.g:
id :: MooreT a b b
id x = x
有没有办法定义这样的实例?或者我是否必须为特定类型MooreT
定义a
,例如type IntMooreT a b = MooreT Int a b
?
我还是Haskell的新手,所以我很抱歉,如果这是一个愚蠢的问题。
答案 0 :(得分:2)
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