GHC 8.0では、関数の引数の前-XTypeApplications
に型を明示的に指定できます。特にいくつかが導入され@
た場合、どのタイプを正確に指定しますか?@
1 に答える
関数の型を見ると
elem :: (Foldable t, Eq a) => a -> t a -> Bool
t
2 つの多相変数とがあることがわかりますa
。これらの変数は、@
タイプ アプリケーションが指定するものです。コンテキストで導入された変数 (型クラスの制約が行われる場所) は順序に影響するようです。したがって、最初の変数は を@
指定しt
、2 番目の変数は を指定しますa
。コンテキスト変数のない関数内
const :: a -> b -> a
順序はより明白で、a
が最初でb
2 番目です。上記のコメントで Cactus が述べたように、明示的な forall を使用して自分で順序を指定することもできます。
myConst :: forall b a. a -> b -> a
これで、最初のタイプのアプリケーションは を指定しb
、2 番目のタイプのアプリケーションは を指定しますa
。
特にオーバーロードされた文字列またはリストを使用している場合は、型を指定する必要があるというこの問題に遭遇する可能性があります
elem c "abc...xyz" -- What string type is this?
elem c ['a' .. 'z'] -- What list constructor is this?
したがって、明示的な型のアプリケーションを使用します
elem @[] @Char c ['a' .. 'z']
この場合、 GHC はリスト要素から推論するため、 を指定して@[]
「これはリスト型コンストラクタです」と言うだけでよいため、ここでは省略できます。[]
Char
@Char
GHC が推論できる多相引数がたまたま最初に来る場合は、型アプリケーション シグネチャを含む型シグネチャで-XPartialTypeSignatures
使用できるように活用できます。GHC にその型 [の一部] を推論するだけで冗長さを軽減できます。_
f @_ @[]