3

Applicative functor に関するLYAHの章を読んでいますが、次の例を理解していないようです:

ghci> :t fmap (++) (Just "hey")  
fmap (++) (Just "hey") :: Maybe ([Char] -> [Char])

しかし、これを見ると:

ghci> :t (++)
(++) :: [a] -> [a] -> [a]
ghci> :t fmap
fmap :: Functor f => (a -> b) -> f a -> f b

(*3)(++"this")のようなものが(a -> b)型にどのように適合するかは理解できますが、 [a] -> [a] -> [a] の方法がわかりません。 (a -> b)に適合しますか?

4

5 に答える 5

7

重要なのは->、 が右に関連付けられることa -> b -> cですa -> (b -> c)。~と~を設定することで適合[a] -> [a] -> [a]します。関数は、 type の結果を返す 2 つの引数の関数、または type の結果を返す 1つの引数の関数として表示できます。c -> dc[a]d[a] -> [a][a] -> [a] -> [a][a][a] -> [a]

于 2012-08-24T13:11:29.473 に答える
6

bin a -> bはスカラーである必要はなく、関数でもかまいません。

[a] -> [a] -> [a]と考えることができ[a] -> ([a] -> [a])ますb[a] -> [a]

于 2012-08-24T13:10:36.223 に答える
5

いつものように並べて、

fmap :: Functor f => ( a    ->      b      )   ->      f a        ->   f b
fmap                       (++)                    (Just "hey")   ::   f b
(++) ::               [c]   -> ([c] -> [c])

それで、

a ~ [c]  ,    b ~ ([c] -> [c])  ,    f ~ Maybe  ,    a ~ [Char]  ,   c ~ Char

f b ~ Maybe b ~ Maybe ([c] -> [c]) ~  Maybe ([Char] -> [Char])

ここでは思考は関係しません。タイプの統合は機械的なプロセスです。


そして、あなたの特定の質問(言い換え)に答えるために、「どの[c] -> [c] -> [c]ように一致させることができるかa -> b、ここに行きます:

  • 型署名の括弧を省略するのは悪いことです(Haskellを初心者に教えるとき)
  • Haskellには、バイナリ関数はありません。すべての関数は単項です。
  • したがって(他の人がすでに述べたように)、型署名の矢印は右に関連付けられます
于 2012-08-24T13:22:54.857 に答える
4

Maybe 型の fmap の定義を考えてみましょう。

fmap f (Just x) = Just (f x)

あなたの例では次のようになります

fmap (++) (Just "Hey") = Just ("Hey" ++) :: Maybe ([Char] -> [Char])

fmap がそうであるように、Maybe コンテナー内の (++) 関数を単純に持ち上げて、コンテンツに適用しました。

于 2012-08-24T13:13:58.683 に答える
4

本当に簡単です:-)。簡単な括弧を追加しましょう:

[a]->[a]->[a]のようなものです[a]->([a]->[a])

したがって、 a と b を でa->b置き換えることで収まります。++ に文字列を渡すと、型の関数が返されます[a][a]->[a]string->string

fmap (++) (Just "hey") 文字列 "hey" を別の文字列の前に付ける関数を保持する多分モナドです。さすがにタイプですMaybe ([Char] -> [Char])

于 2012-08-24T13:09:56.057 に答える