5

Learn You a Haskellの例の1つは、次のとおりです。

pure (+) <*> Just 3 <*> Just 5

彼は次のように述べています。

したがって、最初はpure (+)Just (+)

Haskellが関数の型推論を使用して、LHSの関数が型クラスのインスタンスからのものになること<*>を決定していると仮定しています( RHSで使用しているという事実に基づいて、はです)。pureMaybeApplicativeJust 5JustMaybe

ただし、メソッドを使用してApplicative Functorに変換したい値があるが、関数をpure介してすぐに使用することは<*>ないため、Haskellがどのpure関数を使用するかを決定できない場合があります。使用する?もしそうなら、どのpure関数を使用するかをどのように明示的に述べますか?

pureまたは、関数の結果が特定のコンテキストで使用されるまで(ある時点で関数にpureフィードする場合など)、Haskellがどの関数を判別しようとしない場合がありますか?<*>

4

1 に答える 1

11

タイプアノテーションを付けます。変数として定義する場合は、最上位の型アノテーションを使用します。

foo :: Maybe (Integer -> Integer -> Integer)
foo = pure (+)

(これは、letおよびwhere句でも機能します。)

または、式で使用している場合は、と記述し(pure (+) :: Maybe (Integer -> Integer -> Integer))ます。

pure引数に適用しなくても、関連する関数を取得できます。私たちが持っているので:

pure :: (Applicative f) => a -> f a

...希望するタイプの(pure :: a -> Maybe a)を取得すると言うことができます。pureただし(pure :: a -> Maybe a) (+)、よりも混乱するpure (+) :: Maybe (Integer -> Integer -> Integer)ため、一般的には後者の方がおそらく便利です。

ただし、質問の最後の文は正しいです。型アノテーションなしで変数に割り当て、後で型注釈をまったく使用せずにpure (+)特定の具象型(など)で使用できます。Maybe (Integer -> Integer -> Integer)(わずかな制限があります。型シグネチャのないトップレベル変数として定義する場合、単相性の制限により、異なる場所で2つではなく、 1つの特定の型としてのみ使用できます...しかし、おそらくそれについて心配する必要はありません。)

于 2012-07-04T16:48:50.620 に答える