Haskellジェネリック型パラメーターリゾルバーツールまたはメソッド[重複]
たとえば、これらの関数のタイプを見てみましょう。
:t traverse
traverse
:: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)
:t id
id :: a -> a
彼らは具体的な種類を持っていませんが、持っているジェネリック型パラメータを:a
、f
、b
、t
(正しい私を、彼らがいない呼び出された場合、ジェネリック型パラメータをしてください)
このように組み合わせるid
とtraverse
、
:t traverse id [Just 1, Just 2, Nothing]
traverse id [Just 1, Just 2, Nothing] :: Num b => Maybe [b]
Haskellは今、型変数のためのいくつかの具体的なタイプをバインドすることができa
、f
、b
、t
。
t = []
a = Maybe bb
f = Maybe
b = Num bb => bb
以下では、タイプとパラメーターへのマッピングを手動で推測します。これを自動的に行う方法またはツールはHaskellにあります。そのため、例ではいくつかの構成された部分(id
およびtraverse
)を取り、それらのタイプシグネチャを一般的に抽出し、出力時にジェネリック型パラメーター名から具体的な推論型へのマッピング?
こちらの最初の例も参照してください。 https://wiki.haskell.org/Type_inferencemap ord
Haskellが実際の型の名前へのバインディングを見つける方法についての表現 " "。
私たちは、別途の機能を見るとだから我々は名前だけを持ってa
、f
、b
、t
。しかし、その後、我々は結合機能をなどいくつかの余分な情報提供[Just 1, Just 2, Nothing]
、および名前をa
、f
、b
、t
具体的な型にマップされます。
このマッピングを自動的にキャッチして表示したいと思います。
回答
型に作用して型を与えるので、より一般的な型コンストラクターパラメータだf
と思います(種類は、「具体的な型」を意味します)。t
* -> *
*
traverse id
は合成ではなく、関数適用です。引数として。に渡しid
ていますtraverse
。this . that
は、this
との間の関数合成でありthat
、数学的な意味で、(最初の)引数をへの入力としてthat
与え、このアプリケーションの結果をにフィードする関数を作成しますthis
。
このページの例を参照してください。
map :: (a -> b) -> [a] -> [b]
Char.ord :: (Char -> Int)
コマンドラインで記述して自分自身を確認できるため、コンパイラはのタイプがであるmap ord
と推測でき[Char] -> [Int]
ます:t map ord
。
を入力するときにconcerete型で同様の出力を期待する場合、具象型引数と型コンストラクター引数の両方で依然としてポリモーフィック関数である:t traverse id
という単純な理由により、それを取得できませんtraverse id
。
少し異なる例を挙げると、を入力すると:t traverse (:[])
、ここで、(:[])
タイプが期待されます。これは、が期待するa -> [a]
特定のケースであり、次の出力が得られます。(Applicative f) => a -> f b
traverse
traverse (:[]) :: Traversable t => t b -> [t b]
これと比較して:t traverse
、
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
はtraverse
、でtraverse (:[])
、f === []
およびで「インスタンス化」されていることを示しますa === b
。