2016-09-22 45 views
1

我試圖推導摩爾自動機變壓器一類的實例,其中:在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

回答

2

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