在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仍然很陌生,所以我很抱歉,如果这是一个愚蠢的问题。

+0

“我试过写:'实例类(MooreT a)',但我没有工作”。这是做到这一点的正确方法。请给出您尝试的实际代码和您遇到的错误消息,我们可以帮助您修复它 –

+0

此处错误: *类型同义词'MooreT'应该有3个参数,但已经给出了1 *在实例声明对于'Category(MooreT)' – Reddog

+0

@Reddog编译器告诉你到底是什么问题(你应该阅读它给出的错误) - 'MooreT'是一个类型的同义词,这意味着它在使用时必须被完全应用(即,它适用于3个参数),在'实例类别(MooreT a)'中,它显然只适用于一个。 – user2407038

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 
+0

当然你是对的!无法看到树木的森林:)然而,仍然想知道,为什么'实例类别(MooreT a),其中......产生错误。 – Reddog