在Haskell,我怎么得出:例如类别(摩尔AB - >摩尔BC)
问题描述:
我试图推导摩尔自动机变压器一类的实例,其中:在Haskell,我怎么得出:例如类别(摩尔AB - >摩尔BC)
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
+0
当然你是对的!无法看到树木的森林:)然而,仍然想知道,为什么'实例类别(MooreT a),其中......产生错误。 – Reddog
“我试过写:'实例类(MooreT a)',但我没有工作”。这是做到这一点的正确方法。请给出您尝试的实际代码和您遇到的错误消息,我们可以帮助您修复它 –
此处错误: *类型同义词'MooreT'应该有3个参数,但已经给出了1 *在实例声明对于'Category(MooreT)' – Reddog
@Reddog编译器告诉你到底是什么问题(你应该阅读它给出的错误) - 'MooreT'是一个类型的同义词,这意味着它在使用时必须被完全应用(即,它适用于3个参数),在'实例类别(MooreT a)'中,它显然只适用于一个。 – user2407038