2016-07-23 3 views
0

私はアプリケーションファンクタについて学んでいます。応用的Maybeためsourceでは、pure関数は次のようになります。拡大引数を指定し適用ファンクタ純粋なマッチングはラップされていません

instance Applicative Maybe where 
    pure = Just 
    ...etc 

、私はそれがどのように見えると思う:私はpure (Just 5)を呼び出すとき

pure x = Just x 

、それはJust 5を返します。

Just (Just 5)を返さないでください。 Listのための同様

、:

instance Applicative [] where 
    pure x = [x] 

私はそれが[4,5,6]を返しpure [4,5,6]呼び出します。

pure [4,5,6][[4,5,6]]を返すように見えます。

ここで何が起こっているのか簡単に説明できますか?


待って、私はそれを得たと思います - はありませんコンテキストがないことから、pure [4,5,6]は、それだけで一般的なケースを使用して、同じ値を返すだListためApplicativeを使用していません。これは正しいです?

+1

「純粋な3」と「(純粋な:おそらくInt - >おそらくIntbe)$ Just 3」を試してください。私はそれが一般的なケースを使用していると思うし、[ghciがIOにデフォルトしようとする](https://downloads.haskell.org/~ghc/7.10.2/docs/html/users_guide/interactive-evaluation.html)、 ' pure(Just 5) 'は' IO(Maybe Int) 'として評価されます。 – Yosh

+3

純粋な型は* '* ma - > m(ma)'ではありません - ''純粋なx 'の値 'x'がすでに' m'の内側にある場合、 'm'純粋なものは同じmとなるでしょう。 @Yoshが述べたように、GHCiプロンプトに 'pure .. 'と入力すると、デフォルトの' a - > IO a'がデフォルトになります。もしデフォルトでなければ、印刷しようとするとあいまいなタイプのエラーになります(例えば、 'pure()'が 'Applicative f => f()'のようなタイプのもの) – user2407038

答えて

6

pureは、オーバーロードされた関数です。それは任意のタイプの値を取るa、そしてそれを適用ファンクタfに包んでいます。

ghci> :t pure 
pure :: Applicative f => a -> f a 

fは、コンテキストによって決まります。あなたがMaybeを期待する関数にpure xを渡している場合、型チェッカは、f ~ Maybeを推測し、Applicativepure xMaybeのインスタンスを選択しますJust xと評価されます。同様に、pure xをリストの関数に渡すと、タイプチェッカーは[]のインスタンスApplicativepure xを使用してシングルトンリストを返します。あなたのケースでは

ghci> :t map 
map :: (a -> b) -> [a] -> [b] -- map is a list function 
ghci> map (+1) (pure 4)  -- so when we pass in (pure 4) 
[5]       -- it means a singleton list 

、私はあなたがGHCiのプロンプトでpure xを入力していることを推測しています。コンテキストを指定しない場合(例えば、pure xにリスト関数を適用する場合)、GHCIはのインスタンスApplicativeを使用することを前提としています。pure xは何もしません.xを返します。 GHCIはその忠実な実行をそのIOアクションです。

​​

型チェッカーは、あなたのコードに基づいてコンテキストが表示されないことができた場合は、型注釈を使用して手動でコンテキストを宣言することができます。

ghci> pure "hello" :: Maybe String 
Just "hello" 
ghci> pure (Just 3) :: Maybe (Maybe Int) 
Just (Just 3) 
ghci> pure [1,2,3] :: [[Int]] 
[[1,2,3]] 
+0

GHCIのプロンプトが正しいと思います。興味深いことに、それはIOのコンテキストを取る、それは私が行方不明だった部分でした。ありがとうございました! – Ben

関連する問題