2013-04-20 13 views
18

私は非常にハスケルの初心者です。答えが明らかな場合は謝りますが、私はTypeclassopediaを通して努力していますカテゴリをよく理解するファンクタのセクションのための演習を行うとき、私はこの問題に出くわした: Functorのインスタンスにはなれないkind * * *の型の例

は一種のタイプの例を与える* - > *(未定義使用せずに) のFunctorのインスタンスを作ることができません。

私が最初に考えたのはFMAPの無限再帰定義のいくつかの種類を定義することでしたが、その本質的undefinedを定義で使用された場合と同じではないでしょうか?

誰かが答えを説明することができれば、非常に感謝します。

ありがとうございます!ここではオリジナルのエクササイズ、セクション3の

出典:http://www.haskell.org/haskellwiki/Typeclassopedia#Introduction

+1

'( - > int)'についてはどうですか? –

+1

@RamonSnir '(( - >)Int)'は実際にはうまくいきますが、 'data K a = K(a - > Int)'のようなものが必要です。 –

+0

@MikhailGlushenkov、それは '(+ 1)= \ a - > a + 1'のように、ほとんど確実にRamonが意味するものです。 – huon

答えて

22

簡単な例は、ここで

data K a = K (a -> Int) 

では、GHCiのが私たちを私たちは自動的にKためFunctorインスタンスを導出しようとしている告げるものです:

Prelude> :set -XDeriveFunctor 
Prelude> data K a = K (a -> Int) 
Prelude> :k K 
K :: * -> * 
Prelude> data K a = K (a -> Int) deriving Functor 

<interactive>:14:34: 
    Can't make a derived instance of `Functor K': 
     Constructor `K' must not use the type variable in a function argument 
    In the data type declaration for `K' 

標準Functorクラスは実際にはを表しています(fmapは引数をf a -> f bに持ち上げます)、b -> Int(Ramonの答えを参照)の関数を得るためにa -> ba -> Intを構成する方法はありません。しかし、それは反変関手のための型クラスを定義することが可能です:

class Contravariant f where 
    contramap :: (a -> b) -> f b -> f a 

Kそのインスタンスを作る:Haskellの中に共分散/ contravarianceの詳細について

instance Contravariant K where 
    contramap f (K g) = K (g . f) 

hereを参照してください。

編集:また、Chris Smith on Redditのa nice comment on this topicもあります。私の(短い)コメント上とミハイルの答えに拡大すること

+1

+1はCoFunctorのためです。 –

+0

私が正しく理解していれば、問題は、Kのfmap定義に対して、 '(a - > b) - > K(a - > Int) - > K(a - > b)' 'a - > Int'型の関数と' a - > b'型の関数を作成しようとすると定義できます。なぜなら型 'a'は' Int'に固定されなければならないからです。 –

+4

@JS 'a - > b'型の関数と' a - > Int'型の関数があり、 'b - > Int'型の関数を生成する必要があります。しかし、希望の出力を得るために入力を構成する方法はありません。 –

6

(a -> Int) -> (a -> b) -> (b -> Int) 

のか::(-> Int)

を考えると、次のような見てfmapを期待

(a -> Int) -> (a -> b) -> b -> Int 

3つの引数から、(a -> Int)(a -> b)bに到達する可能性はないことを証明するのは簡単です(undefinedなし)、したがって(a -> Int)(a -> b)から届く方法はありません(b -> Int)。結論:no Functorインスタンスは(-> Int)のために存在します。

+2

証明は簡単です:我々は二つの定理を持っていますが、どちらも 'a'の証明が必要です。私たちは 'b'の証明しか持っていません。新しい定理は導き出すことができません(定理のどれも当てはまらないので)=> 'Int'に対して証明を導き出すことはできません。 –

関連する問題