文脈を読む感じで。
Prelude Control.Applicative> [(x*) | x <- [1..9]] <*> [1..9]
リスト内包表記が操作してる感を醸し出しているので排除する。
Prelude Control.Applicative> (*) <$> [1..9] <*> [1..9]
2つのリストから値を取り出しては、可能な組み合わせ全てに対して掛け算をする。
Prelude Control.Applicative> :t ((*) <$>) ((*) <$>) :: (Functor f, Num a) => f a -> f (a -> a) Prelude Control.Applicative> :t [1..9] <*> [1..9] [1..9] <*> [1..9] :: (Enum a, Enum (a -> b), Num a, Num (a -> b)) => [b]
さらに、これをliftAを使って書き直せば
Prelude Control.Applicative> liftA2 (*) [1..9] [1..9]
これは、掛け算っていう演算をアプリカティブの文脈に持ちあげておいて、リストに適用するっていう理解でいいのかな。
Prelude Control.Applicative> :t liftA2 (*) liftA2 (*) :: (Num c, Applicative f) => f c -> f c -> f c