путаница с использованием функтора <$> - PullRequest
0 голосов
/ 06 ноября 2018

Почему код строки

generateScripts pb = (greet <$>) <$> (maybeName <$> pb

есть дополнительный функтор после greet? Исходя из моего понимания, я знаю, что функция LHS будет использоваться в RHS, но, поскольку есть дополнительный функтор, я не понимаю, как он работает.

maybeName :: (String, String) -> Maybe String
maybeName p = if length (snd p) == 10 then Just (fst p) else Nothing

generateScripts :: [(String, String)] -> [Maybe String]
generateScripts pb = (greet <$>) <$> (maybeName <$> pb)
    where greet = ("Hello "++)

phonebook = [ ("Bob",   "0178866524"), ("Fred",  "01624556442"), ("Alice", "0188998533") ]
GHCi> phonebook = [ ("Bob",   "0178866524"), ("Fred",  "01624556442"), ("Alice", "0188998533") ]
GHCi> generateScripts phonebook
[Just "Hello Bob",Nothing,Just "Hello Alice"]

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Похоже, <$> около greet является fmap для Maybe, то есть применяется greet к x, если значение равно Just x, и ничего не делает в случае Nothing .

Итак, maybeName <$> pb отображает maybeName функцию по списку pb, <$> в середине отображает greet <$> по результату, а сам greet <$> изменяет Just значения с помощью greet.

0 голосов
/ 06 ноября 2018

pb - это список (String, String) кортежей.

maybeName <$> pb карты maybeName над этим списком, давая [Maybe String] (список Maybes). Рассматриваемый функтор [].

(greet <$>) <$> ... отображает (greet <$>) по этому списку, то есть он применяется (greet <$>) к каждому элементу списка (элементы, имеющие тип Maybe String). Рассматриваемый функтор [].

(greet <$>) карты greet более Maybe String. Рассматриваемый функтор Maybe.

Как правило, если у вас есть функция f :: a -> b, то (f <$>) :: (Functor f) => f a -> f b и ((f <$>) <$>) :: (Functor f, Functor g) => g (f a) -> g (f b). Каждые <$> отображаются поверх другого слоя функтора.

В этом случае у нас есть g = [] и f = Maybe, поэтому это эффективно заставляет greet :: String -> String работать со структурой, где строки вложены на два уровня глубиной, например [Maybe String].

0 голосов
/ 06 ноября 2018

(greet <$>) - это функция, которая применяется к каждому элементу типа Maybe String, а (greet <$>) <$> применяется ко всему списку, т. Е. [Maybe String], как иллюстрация

(greet <$>) <$> (maybeName <$> pb)
= (greet <$>) <$> [Just "Bob", Nothing, Just "Alice"]
= [greet <$> Just "Bob", greet <$> Nothing, greet <$> Just "Alice"] 
...