Control.Applicative.(<$)
Control.Applicative モジュールに (<$) という関数があります。が、どういう関数なのかわからないので調べます。
型
ghci> :m +Control.Applicative ghci> :t (<$) (<$) :: Functor f => a -> f b -> f a
型を見ると、b は使われずに a が残るようです。実際にどんな動きをするか確かめます。
動作
Maybe
ghci> "WRYYY" <$ Just "ORA-ORA" Just "WRYYY" ghci> "WRYYY" <$ Nothing Nothing
List
ghci> 'a' <$ [1, 2, 3] "aaa" ghci> 123 <$ "abc" [123,123,123] ghci> 123 <$ [] []
Either
ghci> 123 <$ Right "xyz" Right 123 ghci> 123 <$ Left "error" Left "error"
代表的な Monad (Functor) で幾つか試してみました。動作は、右の値を捨てて左の値を文脈に取り込む、と言ったところでしょうか。
使いどころ
Real World Haskell の 16 章の JSON パーサーの例に以下のような使い方がありました (null の所)。
p_value :: CharParser () JValue p_value = value <* spaces where value = JString <$> p_string 〜 略 〜 <|> JNull <$ string "null"
文字列 "null" がある場合は JNull を返すのですが、JNull は引数をとらないので、string パーサーの結果を捨てています。