2017-04-10 35 views
10

fmap'un fmap :: Functor f => (a -> b) -> f a -> f b ve sum'un sum :: (Num a, Foldable t) => t a -> a olduğunu biliyoruz, ancak aşağıdaki kod beni şaşırtıyor.Neden `fmap toplamı` `typecheck?

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

Neden?

+0

eminim aynıdır

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

deneyebileceğiniz [it] (https://www.tryhaskell.org/). –

+0

Evet, 'toplamı' Data.Foldable' – zerkms

cevap

10

Sanırım burada iki kafa karıştırıcı bit var.

Birincisi, en belirgin olanı, sum'un sadece listelerde değil Foldable şeyler üzerinde çalıştığıdır. Bu nedenle, kullandığınız functor örneği ikinci olur. Just bir işlevi olduğu için, fmap ikinci bağımsız değişkeni olduğu gibi, burada (https://hackage.haskell.org/package/base-4.9.1.0/docs/src/GHC.Base.html#line-638) yalnızca (.) olarak tanımlanmış fmap okuyucu örneğini kullanıyorsunuz.

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

:

sen aslında (Sadece fmap toplamı) sonucunu fmap üç argüman besleyen, fakat, çünkü garip görünüyor ve kontrol tipi olmamalı gibi bir işlevdir fmap'u . ile değiştirirsek, işler biraz daha anlamlı hale gelir.

sum (Just 3) 
+0

'dan geldiğini fark ettim. Ben haskell acemi oldum. Okuyucu örneğini öğrenmedim, ama bence haklısın. Daha sonra kontrol edeceğim. –

+1

Rica ederim. Bu örnek çoğu durumda '((->) r)' olarak gösterilir ve bu durum bir yerlerde ortaya çıktıklarında ne olup bittiğini kaçırmak kolay olabilir, çünkü işlevler bir şekilde özel davranmaları gerektiği gibi hisseder, ancak Haskell'de Diğer her şey gibi bir tür, diğer dillerden daha tutarlı. –