2016-08-21 8 views
0

のは、私はそれが何をするかを理解しようとする単純な例としてfmap . constを見てみましょう:私は気づく拳の事は、私が理解しようとするとabがあいまいであるということですバインド型の変数

fmap :: Functor f => (a -> b) -> f a -> f b 
const :: a -> b -> a 

fmap . const。 2つ以上の関連する署名を一緒に使用すると、「GHCIセッション」という意味になります。

fmap :: Functor f => (a -> b) -> f a -> f b 
const :: c -> d -> c 
fmap . const :: Functor g => h -> g i -> g h 

レッツ・バインドg = fgが削減:

fmap . const :: Functor f => h -> f i -> f h 

好い加減なバージョンのための最小混乱変数名としてh :: hを選んでここ

は私がより良いものを理解する助けとなるかの例です:

\h -> fmap (const h) :: Functor f => h -> f i -> f h 

h = cを結合してhを減らす:

\c -> fmap (const c) :: Functor f => c -> f i -> f c 

さて、f ccconstに最初の引数から来たことを確認する方がはるかに簡単です。私はまた、iaが自由であることを知っています。私はそれらを「操作」する必要がなかったからです。

質問:

  • GHCIセッションで再使用されている文字を防止する方法はありますか?
  • GHCIセッションでタイプ変数をバインドして減らす方法はありますか?
  • 最後に、同等の思考プロセスを実行するより簡単な方法があると思われます。
+1

コンパイラが選択するtyvar名を制御することはできません。型変数をバインドしたり減らしたりするのは私にとっても意味がない。 ( 'a'と' b'は '' fmap。const''であいまいではありません。最後に、ここでの思考過程が何であるか分かりません.GHCiに式のタイプを尋ねているようです。 – user2407038

+0

私が正しく理解していれば、同じタイプの変数名が異なるシグネチャで再利用されることに問題がありますか?署名が異なるとスコープが異なるため、型変数は互いに完全に無関係です。他の式を適用して式を構築するときは、適切な型を見つけるために置換を避けなければならないかもしれませんが、これはGHCiによって自動的に行われます(例えば、 ':t fmap。const 'これを行うだろう)。私はまた、この文脈であなたが「束縛して減らす」ことを意味するかどうかもわかりません。 –

+0

この問題を解決する別の方法は、 ':t fmap.const'型が実際に' fmap'と 'const'の型を与えられているとGHCIが主張している証拠を生成することです。 – sevo

答えて

0

シグネチャの型変数は、暗黙のユニバーサル量限定子によって実際にバインドされます。言語拡張は、これがコンパイルされることを確認し、それが明示的に作ることがあります:

{-# LANGUAGE ExplicitForAll #-} 

fmapPrime :: forall a b f. Functor f => (a -> b) -> f a -> f b 
fmapPrime = fmap 

constPrime :: forall a b. a -> b -> a 
constPrime = const 

fmapConst :: forall a b f. Functor f => b -> f a -> f b 
fmapConst = fmap . const 

ですから、型変数変数は、「再利用」していると言うことはできません:彼らは無料ではありません。