Applicativeを使って複数の文字列を結合するにはどうすればいいですか


アプリカティブスタイルで

[code]

    (++) <$> Just "a" <*> Just "b" -- = Just "ab"
    
[/code]

のような例がよくありますが、これを

[code]

    (++) <$> Just "a" <*> Just "b" <*> Just "c" <*> ... -- Just "abc...
    
[/code]

と繋げていくように記載することは出来ないでしょうか？



[code]

    (++) <$> Just "a" <*> Just "b" -- = Just "ab"
    
[/code]

で、Maybe String が二つしか連結できないのは、そもそも元の`(++)`が引数を二つしか取れないからです。別の言い方をすれば、`(++) "a"
"b"`をMaybeアプリカティブにしたものが上の式です。

`(++)`単独では任意の個数の文字列をとることができないので、まずアプリカティブにする前に、素の文字列で任意の個数の文字列を連結する方法を考えます。

[code]

    foldl1 (++) ["a", "b", "c"] -- = "abc"
    
[/code]

あとは、文字列と関数をアプリカティブにします。

[code]

    foldl1 (liftA2 (++)) [Just "a", Just "b", Just "c"] -- = Just "abc"
    foldl1 (liftA2 (++)) [Just "a", Nothing, Just "c"] -- = Nothing
    
[/code]

