Haskellの表現がどのように機能するかを理解していないと、それをより基本的な形に分解するのに役立つことがよくあります。
次の定義を使用する
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
私は次のように書き直しsequenceA [(+3),(+2)] 3
ました
(\_ -> (:)) <*> (+3) <*> ((\_ -> (:)) <*> (+2) <*> (\_-> [])) $ 3
そしてそれをに変えました(フォーマットを許してください;私は行を分割するための規則が何であるかわかりません)
(\d ->(\c->(\b -> (\a -> (\_ -> (:)) a (+3) a) b (\_ -> (:)) b) c (+2) c) d (\_ -> []) d) 3
手作業で作業する場合は正しいように見えますが、GHCiに受け入れてもらうことはできません。私はここで何を間違えましたか?私の2番目の質問は、この形式から機能合成に変換する方法です。ドットをさまざまな組み合わせで置き換えてみましたが、GHCiはそれらすべてを拒否します。