0
のは、私はそれが何をするかを理解しようとする単純な例としてfmap . const
を見てみましょう:私は気づく拳の事は、私が理解しようとするとa
、b
があいまいであるということですバインド型の変数
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 = f
とg
が削減:
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 c
でc
がconst
に最初の引数から来たことを確認する方がはるかに簡単です。私はまた、i
とa
が自由であることを知っています。私はそれらを「操作」する必要がなかったからです。
質問:
GHCI
セッションで再使用されている文字を防止する方法はありますか?GHCI
セッションでタイプ変数をバインドして減らす方法はありますか?- 最後に、同等の思考プロセスを実行するより簡単な方法があると思われます。
コンパイラが選択するtyvar名を制御することはできません。型変数をバインドしたり減らしたりするのは私にとっても意味がない。 ( 'a'と' b'は '' fmap。const''であいまいではありません。最後に、ここでの思考過程が何であるか分かりません.GHCiに式のタイプを尋ねているようです。 – user2407038
私が正しく理解していれば、同じタイプの変数名が異なるシグネチャで再利用されることに問題がありますか?署名が異なるとスコープが異なるため、型変数は互いに完全に無関係です。他の式を適用して式を構築するときは、適切な型を見つけるために置換を避けなければならないかもしれませんが、これはGHCiによって自動的に行われます(例えば、 ':t fmap。const 'これを行うだろう)。私はまた、この文脈であなたが「束縛して減らす」ことを意味するかどうかもわかりません。 –
この問題を解決する別の方法は、 ':t fmap.const'型が実際に' fmap'と 'const'の型を与えられているとGHCIが主張している証拠を生成することです。 – sevo