2016-09-22 12 views
1

私はムーアオートマトンの変圧器のためのCategoryインスタンス、導出しようとしています:は、どのように私は導出を実行します。インスタンスのカテゴリ(ムーア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 

このようなインスタンスを定義する方法はありますか。または、特定のタイプaMooreTを定義する必要がありますか?例えば、type IntMooreT a b = MooreT Int a b

私はまだハスケルに新しいので、これはばかな質問であればごめんなさい。

+0

"私は「インスタンスカテゴリ(MooreT a)」と書いてみましたが、動作しませんでした。それが正しい方法です。あなたが試した実際のコードとあなたが遭遇したエラーメッセージを教えてください。 –

+0

エラー: *タイプ同義語 'MooreT 'は3つの引数が必要ですが、与えられました1 *インスタンス宣言(MooreT a) – Reddog

+0

@Reddogコンパイラは問題が何であるかを正確に教えてくれました。(あなたにはエラーがあります) - MooreTは型シノニムです。それは3つの引数に適用されます)、 'インスタンスカテゴリ(MooreT a)では、1つだけに明確に適用されます。 – user2407038

答えて

2

MooreT aはのサブタイプ(->)の同義語です。 (->)にはすでにCategoryのインスタンスがあるため、MooreT aもあります。

ghciMooreTが既に.で構成されているかどうかを確認できます。 、MooreT値カップルはダミー組成物は

Control.Category Prelude> :t g . f 
g . f :: Moore A B -> Moore A D 
を動作することを 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 

チェックを行い、我々は

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 

を輸入し、右.を持っていることを確認し、あなたの定義とCategoryを輸入して起動します

+0

もちろん、あなたは正しいです!木の森を見ることができませんでした:)しかし、なぜ、 'インスタンスカテゴリ(MooreT a)どこに...'がエラーを生成するのかと疑問に思っています。 – Reddog

関連する問題