2017-04-10 11 views
10

我々はfmapfmap :: Functor f => (a -> b) -> f a -> f bであり、sumsum :: (Num a, Foldable t) => t a -> aであることを知っていますが、以下のコードは私を混乱させます。なぜfmap sum just typecheckですか?

> :t (fmap sum Just) 
(fmap sum Just) :: Num b => b -> b 
> fmap sum Just 3 
3 

なぜですか?

+0

私は確信していると同じです

Prelude> (.) sum Just 3 3 Prelude> (sum . Just) 3 3 

、あなたが試すことができます[それ](https://www.tryhaskell.org/)。 –

+0

うん、「データ」が「金額」であることがわかった。 – zerkms

答えて

10

おそらく2つの混乱しているビットがあると思います。

最初に、最も明白なのはsumFoldableで動作し、リストだけではありません。したがって:

sum (Just 3) == 3 

2番目は使用しているファンクターインスタンスです。 Justは関数で、fmapの2番目の引数であるため、ここではと定義されているfmapのリーダインスタンスを使用しています(https://hackage.haskell.org/package/base-4.9.1.0/docs/src/GHC.Base.html#line-638)。

それは奇妙に見えますが、それは入力チェックをべきでないように、あなたはFMAPに3つの引数を供給しているため、実際には(ジャストFMAP合計)の結果が関数である:

Prelude> :t fmap sum Just 
fmap sum Just :: Num b => b -> b 

fmap.に置き換えると、少し意味があります。

sum (Just 3) 
+0

ありがとう。私は初心者です。私はリーダーのインスタンスを学んだことはありませんが、あなたが正しいと思います。私は後でそれを確認します。 –

+1

ようこそ。このインスタンスはたいていの場合、 '(( - >)r 'と表示されます。関数が何とか特別な動作をするように感じるので、これがどこかに現れたときに何が起こっているのかを簡単に知ることができます他の言語と同じように、他の言語よりも一貫性があります。 –

関連する問題