Haskellジェネリック型パラメーターリゾルバーツールまたはメソッド[重複]

Dec 12 2020

たとえば、これらの関数のタイプを見てみましょう。

:t traverse
traverse
  :: (Applicative f, Traversable t) => (a -> f b) -> t a -> f (t b)

:t id
id :: a -> a

彼らは具体的な種類を持っていませんが、持っているジェネリック型パラメータをafbt(正しい私を、彼らがいない呼び出された場合、ジェネリック型パラメータをしてください)

このように組み合わせるidtraverse

:t traverse id [Just 1, Just 2, Nothing] 
traverse id [Just 1, Just 2, Nothing] :: Num b => Maybe [b]

Haskellは今、型変数のためのいくつかの具体的なタイプをバインドすることができafbt

t = []
a = Maybe bb
f = Maybe
b = Num bb => bb

以下では、タイプとパラメーターへのマッピングを手動で推測します。これを自動的に行う方法またはツールはHaskellにあります。そのため、例ではいくつかの構成された部分(idおよびtraverse)を取り、それらのタイプシグネチャを一般的に抽出し、出力時にジェネリック型パラメーター名から具体的な推論型へのマッピング?

こちらの最初の例も参照してください。 https://wiki.haskell.org/Type_inferencemap ordHaskellが実際の型の名前へのバインディングを見つける方法についての表現 " "。

私たちは、別途の機能を見るとだから我々は名前だけを持ってafbt。しかし、その後、我々は結合機能をなどいくつかの余分な情報提供[Just 1, Just 2, Nothing]、および名前をafbt具体的な型にマップされます。

このマッピングを自動的にキャッチして表示したいと思います。

回答

Enlico Dec 12 2020 at 00:55

に作用して型を与えるので、より一般的な型コンストラクターパラメータfと思います(種類は、「具体的な型」を意味します)。t* -> **

traverse idは合成ではなく、関数適用です。引数として。に渡しidていますtraversethis . 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 btraverse

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