2017-05-30 13 views
3
(<*>) :: Applicative f => f (a -> b) -> f a -> f b 
Const :: a -> Const a b 
Monoid m => Applicative (Const * m) 

Const "a" <*> Const "b" -- yields Const "ab" 
Const a <*> Const a = Const a <> Const a 

この動作は、Constがバイナリタイプのコンストラクタであるという事実と関係があります。bには決して触れません(ファントムタイプ)。しかし、この場合、a(それぞれ*)が破棄されたように見えるので、私はConst * mを理解しません。Constインスタンスの<*>が2つの非機能的な値を受け入れるのはなぜですか?

+0

はどのようにして 'モノイドメートル=>のApplicative(定数*メートル)'出力を生成しなかった行を取得しますか? – Krom

+0

は[Hackage](http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Applicative.html#v:Const)からコピーしました – ftor

答えて

5

最初にmMonoidインスタンスを持つ場合、Const mApplicativeインスタンスを持ちます。しかしApplicative (Const m)ため<*> のタイプは

 (<*>) :: Const m (a -> b) -> Const m a -> Const m b 

を読み込むようConst mは、まだ型コンストラクタで今Const "a"Const "b"にこれを適用してみましょう:

Const "a"はタイプConst String bです。ここでは、上記のタイプ変数mはタイプStringを想定しています。値はbに関してまだ多様であり、その型の具体的な値が含まれていないので、型は何でも構いません。

発現Const "a" <*> Const "b"における多型値Const "a"Const String (a->b)であることが余儀なくされ、多型値Const "b"Const String aであることを余儀なくされます。

実際には、左側に関数型の型があります。具体的な値には、Maybe (Int -> Int)の値Nothingのような関数が含まれていません。

PS .: *がどこから来るのか分かりません。Monoid m => Applicative (Const * m)です。私はGHCiの中

:info Const 

を入力すると、私は

instance Monoid m => Applicative (Const m) 
+0

ああ、この 'Const * m'は混乱しています私。 'Const m'は依然として多相であり、第2の型の変数は決して触られないので、関数を含むすべてのものになる可能性があります。これは、型レベルで定数が完全に意味をなす。壮大! – ftor

+1

Hackageには奇妙なことがあります(私は 'PolyKinds'がオンになっていると思います)。 'Const * m'私は、第2の型のパラメータがpolykinded(それはファントムなので)であると思われるかもしれませんが、' Applicative'をインスタンス化するために 'Const m'は' * - > * 'でなければならない、 (まだ入力されていない型パラメータの種類)を '*'として与える必要があります。したがって、 'm'は* first *型のパラメータであり、' * 'は通常は暗黙のまま残された種類のパラメータなので、設定には慣れていません。とにかくそのようなもの。 – Ben

関連する問題