1

Тема: Haskell: Аплікативний фанктор і списки

Я можу зробити так:

Prelude> let a = (fmap (*)) <$> [Just 10, Just 20] 
Prelude> let x:xs = a
Prelude> x <*> Just 2
Just 20

Але що я хтів би. то це зі списку [Just (*10), Just (*20)] і ще якогось, наприклад, [Just 5] отримати [Just 50, Just 100]. Я якось це зробив вранці, але вже забув, і я не використовував ані рекурсії, ані спискових виразів.

2 Востаннє редагувалося Yola (05.01.2016 18:09:58)

Re: Haskell: Аплікативний фанктор і списки

Прикол, а так вийшло :( Трясця!

Prelude> let a = fmap (<*>) (fmap (*) <$> [Just 2, Just 4])
Prelude> a <*> [Just 3]
[Just 6,Just 12]

Виходить все діло було в тих дужках! Чого б це?

-------------

Загалом. не забувати треба про дужки, і так красивше:

Prelude> let a = fmap (<*>) $ fmap (*) <$> [Just 10, Just 20]
Prelude> a <*> [Just 3]
[Just 30,Just 60]

3

Re: Haskell: Аплікативний фанктор і списки

Бавитесь чи діло робите?

Прихований текст

Функтор же, ну.

4 Востаннє редагувалося Yola (06.01.2016 10:54:19)

Re: Haskell: Аплікативний фанктор і списки

quez написав:

Бавитесь чи діло робите?

Цікаво стало, що таке монади, от і вчу тепер Хаскель:)

Оце зараз не можу добрати як оця штука працює:

sequenceA [(+3),(+2),(+1)] 3

Ну що ж, почнемо з цього визначення:

sequenceA :: (Applicative f) => [f a] -> f [a]  
sequenceA [] = pure []  
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs

Розпишемо:

(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> pure [] 
(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> [] 

і тут я застряг, для якого аплікативного функтора викличеться <*> тут, для цього ((->) r) чи для цього []

(:) <$> (+1) <*> []

5 Востаннє редагувалося Yola (06.01.2016 12:58:34)

Re: Haskell: Аплікативний фанктор і списки

Ага, зрозуміло. Я застосував не те pure, тобто потрібно pure не від Applicative [] , а від Applicative ((->) r)

тоді маємо:

(:) <$> (+1) <*> (\_ -> x)

і тут вже зрозуміло, що використовується <*> від Applicative ((->) r).

А якщо глобально, то

WinGHCi написав:
Prelude> :t [(+3),(+2),(+1)]
[(+3),(+2),(+1)] :: Num a => [a -> a]

Prelude> :t sequenceA
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)

і зіставляння із взірцем дає: t = [], f = (->) a.

Подякували: getwisdom1