私は素晴らしいHaskell Programming from first principlesを読んで私の人生の時間を持っていると私は私がちょうど離れ(ページ1286電子書籍リーダーを)取ることができないんだけど、次の例で来た:それは明らかである`(fmap。fmap)sumの型はちょうど[1、2、3]`が働くのはなぜですか?
Prelude> (fmap . fmap) sum Just [1, 2, 3]
Just 6
私にはどのように次のような作品:
Prelude> fmap sum $ Just [1,2,3]
Just 6
そして、私はすでに手動タイプがどのように機能するかを理解するために(fmap . fmap)
を解体。しかし、これを「2倍にする」と考えると、JustとListの両方のデータコンストラクタを取り上げているので意味がありません。
私はghci
に次のように出て型付け:
Prelude> :t (fmap . fmap)
(fmap . fmap)
:: (Functor f, Functor f1) => (a -> b) -> f1 (f a) -> f1 (f b)
Prelude> :t (fmap . fmap) sum
(fmap . fmap) sum
:: (Num b, Foldable t, Functor f, Functor f1) =>
f1 (f (t b)) -> f1 (f b)
Prelude> :t (fmap . fmap) sum Just
(fmap . fmap) sum Just :: (Num b, Foldable t) => t b -> Maybe b
私は最後の出力を導出する方法を理解していません。 (fmap . fmap) sum
データコンストラクタJust
を渡すとき、とf
の両方をMaybe
に置き換えることをコンパイラはどのように知っていますか?私はここで良い答えを得た後、どうやって自分自身を分かったのだろうか?しかし、関数型(->)
とMaybe
上、(そのタイプの問題を有している(fmap . fmap) sum (Just [1,2,3])
であろう)Maybe
とList
両方にわたって持ち上げていない
'(fmap。fmap)'で '.'の定義を展開します。その後、単純化する。そして、あなたの 'fmap'の使い方の1つが2番目の引数として関数を取っていることに気づくでしょう... – Carl
[アプリケーションの種類に適用する?](https://stackoverflow.com/questions/47498896/apply-function)の可能な複製-y-maybe-types) –
@FyodorSoikin、その質問はほとんど完全に無関係に見えます。 – dfeuer