読者です 読者をやめる 読者になる 読者になる

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 パーサーの結果を捨てています。