[Хаскел]Жесть!

apl13

$cat pp.hs
main = sequence_ $ printPrint putStrLn ["abc","def"]

printPrint :: (a -> IO -> [a] -> [IO ]
printPrint = map

$ghc pp.hs ; a.out
abc
def

$cat pp1.hs
main = printPrint putStrLn ["abc","def"]

printPrint :: (a -> IO -> [a] -> IO
printPrint = sequence_ . map

$ghc pp1.hs

pp1.hs:4:
Couldn't match `[m a]' against `[a1] -> [b]'
Expected type: (a1 -> b) -> [m a]
Inferred type: (a1 -> b) -> [a1] -> [b]
In the second argument of `(.)', namely `map'
In the definition of `printPrint': sequence_ . map

Кто-нибудь может сказать мне, в чем разница? :crazy:

apl13

Полный бред!
printPrint f s  = sequence_ $ map f s

и
printPrint f    = sequence_ . map f

Компилируются.
Если убрать букву f - ломается. :banghead: :crazy:

Chupa

нифига не бред. проверь типы
если что, sequence_ . map f = sequence_ . (map f а не (sequence_ . map) f

pitrik2

sequence_ . (map f а не (sequence_ . map) f
а в чем разница?

pitrik2

ааа
вроде понял
f . g = \ x -> f (g x)
(sequence_ . map) f
(\ x -> sequence_ (map x f
sequence_ (map f)
sequence_ . (map f)
\ x -> sequence_ map f) x)
т.е. автору надо в скобки поставить и все будет ок

apl13

А, блин, я придурок! Мозг периодически выключается. :crazy:
Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: