2016-10-27 12 views
5

GHC 8.0で-XTypeApplicationsを指定すると、関数の引数の前に@の型を明示的に指定できます。正確には何種類のタイプが指定されますか?特に@がいくつか導入されていますか?HaskellではどのようにTypeApplicationsを使用していますか?

+0

私はそれはあなたが、その場合には何のあいまいさがないことから、 'TypeApplications'を使用する場合は(それを包摂するか、' TypedScopeVariables') 'ExplicitForAll'を使用することをお勧めだと思う:あなたは、例えば持っている場合'const :: forall a b。 a - > b - > a'の場合、最初の '@ ' - 引数は' a'のためのもので、 'b'のためのものです。 – Cactus

+0

'ScopedTypeVariables' – dfeuer

答えて

5

あなたが関数の型

elem :: (Foldable t, Eq a) => a -> t a -> Bool 

を見れば、我々は、それは2つの多型の変数、taを持って参照してください。これらの変数は、@タイプアプリケーションが指定するものです。文脈に導入された変数は、型クラスの制約が適用されるので、最初の@tを指定し、2番目はaを指定しているようです。コンテキスト変数なしの関数で

const :: a -> b -> a 

順序は、より明白であるaは最初であり、bが第二です。上記のコメントでCactusが言及しているように、明示的なforallsを使って自分で注文を指定することもできます。

myConst :: forall b a. a -> b -> a 

ここで第一のタイプのアプリケーションはb及び第二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を推定するので "これは[]リスト型のコンストラクタです"というのでここではを省略できます。

GHCは推測することができます多型の引数は、最初にあなたが作るために、あなただけのタイプ[の一部]というを推測するGHCを言って、タイプのアプリケーションシグネチャを含む型シグネチャで_を使用することができます-XPartialTypeSignaturesを活用することができます来て発生した場合物事はそれほど冗長ではない。

f @_ @[] 
関連する問題